ASCII Art Generation


13

Compito

Scrivi un programma o una funzione che acquisisca un'immagine di larghezza we altezza h, e due numeri interi a <= w/2e b <= h/2, e generi una rappresentazione ascii art dell'immagine, con le dimensioni ax b.

L'arte ascii dovrebbe essere generata attraverso i seguenti passaggi (o un altro processo con lo stesso output):

  1. Ridimensionare l' wx himmagine da 2ax 2b. Il colore del pixel (x, y)nell'immagine ridimensionata dovrebbe essere uguale alla media dei colori di tutti i pixel dall'immagine originale all'interno del rettangolo con i seguenti angoli:

    (floor[x * w/2a], floor[y * h/2b])
    (ceil[(x+1) * w/2a], ceil[(y+1) * h/2b])
    
  2. L'immagine ridimensionata deve essere desaturata prendendo la media dei componenti rosso, verde e blu del colore e impostando ciascun componente su questa media.

  3. Un carattere deve essere emesso per ogni blocco di pixel 2x2, seguendo le regole seguenti:

    • Lascia e = 3 - floor[color/64], dove il colore si riferisce al componente rosso del colore del pixel in alto a sinistra (nell'intervallo 0..255). Consenti f, ge hfai riferimento a questo valore, ma rispettivamente per i pixel in alto a destra, in basso a sinistra e in basso a destra.
    • Lasciate zessere la media di e, f, g, h.
    • Emette il carattere corrispondente al seguente (il bianco rappresenta un pixel dove 3 - floor[color/64]è zero e il grigio rappresenta diverso da zero).
    • Tutti i pixel sono zero= Output uno spazio ( )
    • Il pixel in alto a sinistra è diverso da zerooppure Il pixel in alto a destra è diverso da zero= Output "se e (or f) >= 2e 'altrimenti.
    • Il pixel in basso a sinistra è diverso da zerooppure Il pixel in basso a destra è diverso da zero= Output ,se g (or h) >= 2e .altrimenti.
    • Principali pixel diversi da zerooppure Pixel inferiori diversi da zero= Uscita-
    • Pixel sinistro diverso da zerooppure Pixel destra diverso da zero= Uscita;
    • Pixel in alto a sinistra, in basso a destra diversi da zero = Uscita \
    • Pixel in alto a destra, in basso a sinistra diversi da zero = Uscita /
    • Pixel zero in alto a sinistra = Uscita J
    • Pixel zero in alto a destra = Uscita L
    • Pixel zero in basso a sinistra = Uscita 7
    • Pixel zero in basso a destra = Uscita P
    • Tutto diverso da zero
      • z = 1: output *.
      • z = 2: output C.
      • z = 3: output #.

Altre note: tutte le medie prese nei passaggi precedenti dovrebbero usare la divisione intera (ovvero arrotondare verso 0).

È possibile utilizzare una libreria per leggere le immagini, ma le librerie non possono essere utilizzate per le fasi di ridimensionamento e desaturazione.

Ingresso

Il tuo programma prenderà tre dati:

  • Un'immagine. Questa immagine può essere in qualsiasi formato di tua scelta (ad esempio PNG, PPM)
  • La larghezza dell'arte ascii (in numero di caratteri)
  • L'altezza dell'arte ascii (in numero di caratteri)

L'input può essere letto tramite STDIN, passato come argomento della riga di comando, memorizzato come variabile, ecc.

Produzione

Il tuo programma produrrà l'arte ascii generata dall'immagine e attraverso il processo sopra descritto. Ogni riga deve avere la stessa larghezza (la larghezza passata come input) e non è possibile aggiungere o rimuovere spazi aggiuntivi. L'ultima riga potrebbe avere una nuova riga finale, ma ciò non è obbligatorio. Le righe vuote (righe con solo spazi) non devono essere omesse.

Esempi

Tutte le immagini sono state prese da Wikipedia e rese di dominio pubblico. Il programma dovrebbe funzionare con tutte le immagini e gli input validi.

Foto di limoni

Larghezza = 52, Altezza = 25:


            .-- *** - ----.        
          - ********** L .-- .-- 7 ---- P-       
        .J ****************. . ********* \.      
       , ****************** L \ J ********** '.     
      - ********************. J *********** L /     
     J *********************; ./*************.L    
    ; ********************* PJ **************; 7;   
   . ********************** '. *************** ;; *   
   ; **********************; ***************; J *.  
   *********************** ******* P ******** '**;  
   C ********************* C ******* P; *******. **;  
   C ********************** J ***************; **;  
   C *********************; **************** **.;  
   ********************** '*************** P; **   
  J ********************* P *************** / ***   
 . ********************** 7 ************* 'J **;   
 ; ******************** C "'P *********** PJ ***'   
 "7 ****************** C" '********** P. ** C;    
     '* C *************'; ********* - J ** CP     
      '* C ********** P 7 ** 7 ** P / - **** P      
        - * CCCCC * P- '7 ******** P'       
          '---' --- '          

Larghezza: 70, Altezza: 3:

         ---------------------------. .----------------        
    J ***************************** P -J ***************** *** / J **;   
  ---------- ********* P --------- '-------------------- -'        

Patate

Larghezza: 50, Altezza: 25:





        .J ---                                     
      .J * P --- J * L--.          
     J *** 'L -J *********** -        
    J ****; **************** L       
   ; ***** '.J ********************     
   J **** 7 ************************ P  
   ** CC *; . ********* LJ *********** P-   
   ** C * P 'J ********************** -    
   7 * C * L **********************;     
   J * C **; **********************;     
  JC ** C **. ; ; ******** CCC * C ** ** CCCC      
  "7 ***** L. 7 ***** CCCCCC **** CC ** '      
     - *****. -J - ** C * C * CC ****** CC * '       
      ; ** *** CC; '** ***** CCC CCCC *;        
       «- **** - - *** CCCCC *** -         
                               '------'           




Campione di clipart

Larghezza: 26, Altezza: 17:

    -, L 
  J - ** L .C # 
 J '; * PL, C # " 
.PP 7. JC7P  
;; * J ;; , C'C;  
J; CC; L C "#   
* L 7-P; *; PC   
7CL *** J * PC '#   
'7 # C * C # P'; P JC # C- 
 J # CCC # L .JC # CJCC ## C;
;#- -#, CCCCCCCCCCC
; * .- -.C; ; CCCCCCCCCCCC
; **** J ** L; CCCCCCCCCCCC
; *******; 'CCCCCCCCCCCP
'*******' CCCCCCCCCCC'
 '* P-7 *' "CCCCP '-  
               '---       

Questo è , quindi vince la risposta più breve.


2
questa è una sfida paralizzante tranquilla .... ....
Abr001am

Quando dici input di immagini, intendi un nome file? O i dati dell'immagine reale?
sirpercival

Anche @sirpercival va bene
es1024,

Risposte:


6

JavaScript 752, 701

function Z(I,a,b){
    var C=document.createElement('canvas')
    var W=C.width=I.width,H=C.height=I.height,X=C.getContext('2d')
    X.drawImage(I,0,0)
    a*=2,b*=2,W/=a,H/=b
    for(var o=a*b,x=0,y=0,T="",S=[],V;--o;){
        var A=~~(x*W),B=~~(y*H)
        var d=X.getImageData(A,B,(((x+1)*W)<<0)-A,(((y+1)*H)<<0)-B).data
        for(var i=0,p=0,L=d.length;i<L;i+=4)p+=(d[i]+d[i+1]+d[i+2])/3
        p/=L/4
        S[x]=3-(p>>6)
        if(x%2&&y%2){
            var e=V[x-1],f=V[x],g=S[x-1],h=S[x],z=(e+f+g+h)>>2,B=0,c
            B|=e>0?8:0,B|=f>0?4:0,B|=g>0?2:0,B|=h>0?1:0
            c=" ..-';\\J'/;L-7P*".charAt(B)
            c=c=="'"&&(e>1||f>1)?'"':c
            c=c=="."&&(g>1||h>1)?",":c
            T+=c=="*"?z>2?"#":z>1?"C":c:c
        }
        if(++x==a)x=0,y++,V=S,T+=y%2?"\n":"",S=[]
    }
    return T
}

Esempi:

var items = {
    lemons: {w:52, h:25},
    spuds: {w:50, h:25},
    tux: {w:26, h:17}
};

for(var k in items) {
    var val = items[k];
    var img = new Image();
    img.onload = function() {
        console.log(Z(this,this.w,this.h));
    }
    img.src=k+'.png';
    img.w = val.w;
    img.h = val.h;
}

Limoni:

            .--JJL--                   .---.        
          -**********-.--          .--7----P-       
        .J***************L.       .*********\.      
       .******************L      \J**********'.     
      .********************.     ;***********L/     
     J*********************;   ./*************.L    
    ,*********************P    -**************;7;   
    **********************'   .***************;;*   
   ;**********************    ;***************;;*.  
   ***********************    *******PP*******'J*;  
   ***********************    *******P;*******.**;  
   ***************7*******    J******;J*******;**;  
   **********************;    ****************.**;  
   **********************'    ***************P;**'  
  J*********************P     ***************/***   
 .**********************      7*************'J**P   
 ;*********************"      '\***********PJ***'   
 "7*******************"        '**********P.***;    
     '***************'         ;*********-J***P     
      '************P'           7*-7**P/-****P      
        -*******P-               '7********P'       
          '---                       -----          

Spuds:

         J---                                     
      .J*P                     .---*L--.          
     J***'                L -J***********-        
    J****                ;****************L       
   ;*****'             .J******************L*     
   J***L7              ************************P  
   **CC*    .         .*********L'***********P-   
   **C*P    '         J**********************-    
   7*C*L              **********************;     
   J*C**.             **********************;     
  JC**C**      .      7********CCC****CCCC**      
  "7*****L     .       7*****CCCCCC****CC**'      
     -****L. .J         -**C*C**C*******C*'       
      ;**CC***;          '**CCC*****CCCC*;        
       '-****-             --**CCCCCC***-         
                               '------'           

Tux:

                       ,L 
  --**L                C#'
 J';*P-L             ,C#" 
 P  7  7.           ,C7P  
;; J J ;;          ,C"C;  
;; C C  L          C" C   
*L 7-P ;*         ;P  #   
;CL***J**         C'  #   
'7#C*C#C'        ,P JC#C- 
 J#CCC#L      .JCCLJCC##C,
.#-   -#,     JCC#CCCCCCCC
;C.- -.*;    .CCCCCCCCCCCC
;L***J**C    ;CCCCCCCCCCCC
;*******P    'CCCCCCCCCCCP
'*******"     CCCCCCCCCCC'
 '*P-7*'      "CCCCP "--  
               '---       

2

IDL 8.3, 588 597 588 byte

Sto ottenendo valori leggermente diversi rispetto a te, non sono sicuro del perché ... Ho fatto una divisione intera per tutto. Ma altrimenti funziona magnificamente ... questi risultati sono accettabili? Molto meglio ora, anche se non è ancora identico per qualche motivo.

pro c,m,a,b
e=2*a
f=2*b
s=size(m,/d)/[1.,e,f]
g=intarr(3,e,f)
u=floor([0:e-1]*s[1])
x=ceil([1:e]*s[1])-1
v=floor([0:f-1]*s[2])
y=ceil([1:f]*s[2])-1
n=(x-u)#(y-v)
for k=0,2 do for i=0,e-1 do for j=0,f-1 do g[k,i,f-j-1]=total(m[k,u[i]:x[i],v[j]:y[j]],/i)/n[i,j]
g=3-total(g/192,1,/i)
t=intarr(4,a,b)
for i=0,3 do t[i,*,*]=g[rebin([0:a-1]*2+i mod 2,a,b),rebin(2#[0:b-1]+i/2,a,b)]
w=total((t ne 0)*rebin(2^[0:3],4,a,b),1,/i)
for i=0,3 do w+=(w eq 2^i)*(t ge 2)[i,*,*]*(18-2^i+i/2)
w+=(w eq 15)*(total(t,1,/i)/4-1)
print,strmid(' '+"''"+'-.;/P.\;7-LJ*C#",',w[*],1),f='('+strtrim(a,2)+'A1)'
end

Casi test:

IDL> c,read_png('lemons.png'),52,25


            .-J***L-.                 .----.        
          -**********L.--          .J-*LJJ**-       
        .J****************.       J*********J.      
       ,*******************      /J**********7.     
      J********************.    ;J***********L*     
     J*********************;   .\*************/L    
    ;*********************P    ***************;*;   
   .C*********************'   ;***************;**   
   J**********************    J***************;**.  
   ***********************    ****************'**;  
   C*********************C    ********J*******;**;  
   C**********************    *******************;  
   C*********************P   ;****************7**;  
  .**********************'    ***************PJ**'  
  J*********************P     ***************\***   
 .**********************      7*************'***P   
 ;********************C"      ;************PJ**C'   
 "7******************C"        ***********PJ***;    
     '*C*************"         ;*********7J**CP     
      '*C*********CP'           7*****P\-***CP      
        -*CCCCC*P-               '7********P"       
          '---                       -----          

IDL> c,read_png('lemons.png'),70,3
        --------J**********L--------.       .-----------------        
   .J*****************************P'    -*************************;   
  ---------*************P-------         '------7**********P-----  
IDL> c,read_png('potatoes.png'),50,25





         J-"-                                     
      .J*'                     ----JL--           
     -*C*                 * -J***********-        
    J*C*L                ;****************L       
   .*C*-*              .J********************     
   J*CC;-              ********************C**CP  
   *CC#*    7         .**********************P-   
   *CCC;    '         J**********************-    
   7CCCL              **********************;     
   JCCC*.             ****C*C*****CCCC*CC***;     
  ;C*CCCL      .      ;***CC*CCCCCCCCCCCCC**      
  "--*CCC;             7***CCCCCCCCCCCCCCC*'      
     '7CC*L.  .         -*CCCCCCCCCCCCCCCP'       
       7CCCCC*'           7CC#CCCCCCC###P         
        '-7P-'             '-7CC######C-          
                                 '-'              




IDL> c,read_png('penguin.png'),26,17
                       ,L 
      ,                C# 
 "  #- ;             ,##" 
 ;  -  ;            ,#7;  
;" - - ";          ,#"J"  
;  # #  ;          #" #   
;; .-. ,;         ;;  #   
;#-***-#;         #   #   
 7#C*C#P         ,P -C#C, 
 J##-##L       JCCL-CC#CC,
,#"   "#,     JCC#CCCCCCCL
;L.- -.C;    ,CCCCCCCCCCCC
;***L***;    ;CCCCCCCCCCCC
;*******;     CCCCCCCCCCC;
 *** ***"     CCCCCC7CCCP 
 '*P--*'      "CCCCP "-"  
                --"       
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.