ASCII Art Generation


13

Tarea

Escriba un programa o función que tome una imagen de ancho wy alto h, y dos enteros a <= w/2y b <= h/2, y genere una representación artística de la imagen, con las dimensiones ax b.

El arte ascii debe generarse a través de los siguientes pasos (u otro proceso con el mismo resultado):

  1. Cambiar el tamaño del wx himagen para 2ax 2b. El color del píxel (x, y)en la imagen redimensionada debe ser igual al promedio de los colores de todos los píxeles de la imagen original dentro del rectángulo con las siguientes esquinas:

    (floor[x * w/2a], floor[y * h/2b])
    (ceil[(x+1) * w/2a], ceil[(y+1) * h/2b])
    
  2. La imagen redimensionada debe desaturarse tomando el promedio de los componentes rojo, verde y azul del color, y configurando cada componente a este promedio.

  3. Se debe generar un carácter para cada bloque de píxeles de 2x2, siguiendo las siguientes reglas:

    • Let e = 3 - floor[color/64], donde color se refiere al componente rojo del color del píxel superior izquierdo (en el rango 0..255). Deje f, gy hconsulte este valor, pero para los píxeles superior derecho, inferior izquierdo e inferior derecho respectivamente.
    • Vamos a zser el promedio de e, f, g, h.
    • Imprima el carácter correspondiente a lo siguiente (el blanco representa un píxel donde 3 - floor[color/64]es cero y el gris representa distinto de cero).
    • Todos los píxeles son cero= Salida de un espacio ( )
    • El píxel superior izquierdo no es ceroo El píxel superior derecho no es cero= Salida "si e (or f) >= 2y de lo 'contrario.
    • El píxel inferior izquierdo no es ceroo El píxel inferior derecho no es cero= Salida ,si g (or h) >= 2y de lo .contrario.
    • Píxeles superiores distintos de ceroo Píxeles inferiores distintos de cero= Salida-
    • Píxeles izquierdos distintos de ceroo Pixeles derechos distintos de cero= Salida;
    • Arriba a la izquierda, abajo a la derecha píxeles distintos de cero = Salida \
    • Arriba a la derecha, abajo a la izquierda píxeles distintos de cero = Salida /
    • Pixel superior izquierdo cero = Salida J
    • Pixel superior derecho cero = Salida L
    • Abajo a la izquierda píxel cero = Salida 7
    • Inferior derecha píxel cero = Salida P
    • Todo distinto de cero
      • z = 1: salida *.
      • z = 2: salida C.
      • z = 3: salida #.

Otras notas: Todos los promedios tomados en los pasos anteriores deben usar la división de enteros (es decir, redondear hacia 0).

Puede usar una biblioteca para leer imágenes, pero las bibliotecas no pueden usarse para los pasos de cambio de tamaño y desaturación.

Entrada

Su programa tomará tres datos:

  • Una imagen. Esta imagen puede estar en cualquier formato de su elección (por ejemplo, PNG, PPM)
  • El ancho del arte ascii (en número de caracteres)
  • La altura del arte ascii (en número de caracteres)

La entrada puede leerse a través de STDIN, pasar como un argumento de línea de comandos, almacenarse como una variable, etc.

Salida

Su programa generará el arte ascii generado a partir de la imagen y a través del proceso descrito anteriormente. Cada línea debe tener el mismo ancho (el ancho pasado como entrada), y no se pueden agregar ni quitar espacios adicionales. La última línea puede tener una nueva línea final, pero esto no es obligatorio. Las líneas en blanco (líneas con solo espacios) no deben omitirse.

Ejemplos

Todas las imágenes fueron tomadas de Wikipedia y lanzadas al dominio público. Se espera que su programa funcione para todas las imágenes y entradas válidas.

Imagen de limones

Ancho = 52, Altura = 25:


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

Ancho: 70, Altura: 3:

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

Patatas

Ancho: 50, Altura: 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 *** -         
                               '------'           




Muestra de imágenes prediseñadas

Ancho: 26, Altura: 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;
; # - - #, CCC # CCCCCCCC
;*.- -.C; ; CCCCCCCCCCCC
; **** J ** L; CCCCCCCCCCCC
; *******; «CCCCCCCCCCCP
'*******' CCCCCCCCCCC '
 '* P-7 *' "CCCCP" -  
               '---       

Este es el , por lo que gana la respuesta más corta.


2
eso es un desafío paralizante silencioso .... ....
Abr001am

Cuando dice entrada de imagen, ¿se refiere a un nombre de archivo? O los datos de la imagen real?
Sirpercival 05 de

@sirpercival tampoco está bien
es1024

Respuestas:


6

JavaScript 752701

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
}

Ejemplos:

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;
}

Limones

            .--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 bytes

Estoy obteniendo valores ligeramente diferentes a los tuyos, no estoy seguro de por qué ... Hice una división entera para todo. Pero de lo contrario funciona espléndidamente ... ¿son aceptables estos resultados?Mucho mejor ahora, aunque todavía no es idéntico por alguna razón.

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

Casos de prueba:

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 "-"  
                --"       
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.