ASCII Art Generation

13

Tâche

Écrivez un programme ou une fonction qui prend une image de largeur wet de hauteur h, et deux entiers a <= w/2et b <= h/2, et produit une représentation ascii art de l'image, avec les dimensions ax b.

L'art ascii doit être généré à travers les étapes suivantes (ou un autre processus avec la même sortie):

  1. Redimensionner la wx himage pour 2ax 2b. La couleur du pixel (x, y)dans l'image redimensionnée doit être égale à la moyenne des couleurs de tous les pixels de l'image d'origine à l'intérieur du rectangle avec les coins suivants:

    (floor[x * w/2a], floor[y * h/2b])
    (ceil[(x+1) * w/2a], ceil[(y+1) * h/2b])
    
  2. L'image redimensionnée doit être désaturée en prenant la moyenne des composantes rouge, verte et bleue de la couleur et en définissant chaque composante sur cette moyenne.

  3. Un caractère doit être émis pour chaque bloc de pixels 2x2, en suivant les règles ci-dessous:

    • Soit e = 3 - floor[color/64], où la couleur fait référence à la composante rouge de la couleur du pixel supérieur gauche (dans la plage 0..255). Laissez f, get se hréférer à cette valeur, mais pour en haut à droite, en bas à gauche, et les pixels en bas à droite respectivement.
    • Laissez zla moyenne e, f, g, h.
    • Sortez le caractère correspondant à ce qui suit (le blanc représente un pixel où 3 - floor[color/64]est zéro et le gris représente non nul).
    • Tous les pixels sont nuls= Afficher un espace ( )
    • Le pixel supérieur gauche est différent de zéroou Le pixel supérieur droit n'est pas nul= sortie "si e (or f) >= 2et 'sinon.
    • Le pixel inférieur gauche n'est pas nulou Le pixel inférieur droit n'est pas nul= sortie ,si g (or h) >= 2et .sinon.
    • Pixels supérieurs non nulsou Pixels inférieurs non nuls= Sortie-
    • Pixels gauches différents de zéroou Pixels droits non nuls= Sortie;
    • Pixels en haut à gauche et en bas à droite différents de zéro = Sortie \
    • Pixels en haut à droite et en bas à gauche différents de zéro = Sortie /
    • Pixel supérieur gauche zéro = Sortie J
    • Pixel supérieur droit zéro = Sortie L
    • Pixel inférieur gauche zéro = Sortie 7
    • Pixel inférieur droit zéro = Sortie P
    • Tout différent de zéro
      • z = 1: sortie *.
      • z = 2: sortie C.
      • z = 3: sortie #.

Autres notes: Toutes les moyennes prises dans les étapes ci-dessus doivent utiliser une division entière (c'est-à-dire un arrondi vers 0).

Vous pouvez utiliser une bibliothèque pour lire les images, mais les bibliothèques ne peuvent pas être utilisées pour les étapes de redimensionnement et de désaturation.

Contribution

Votre programme comprendra trois données:

  • Une image. Cette image peut être dans n'importe quel format de votre choix (par exemple PNG, PPM)
  • La largeur de l'art ascii (en nombre de caractères)
  • La hauteur de l'art ascii (en nombre de caractères)

L'entrée peut être lue via STDIN, passée sous forme d'argument de ligne de commande, stockée sous forme de variable, etc.

Production

Votre programme affichera l'art ascii généré à partir de l'image et à travers le processus décrit ci-dessus. Chaque ligne doit avoir la même largeur (la largeur passée en entrée), et aucun espace supplémentaire ne peut être ajouté ou supprimé. La dernière ligne peut avoir une nouvelle ligne de fin, mais ce n'est pas obligatoire. Les lignes vides (lignes avec uniquement des espaces) ne doivent pas être omises.

Exemples

Toutes les images ont été extraites de Wikipedia et publiées dans le domaine public. Votre programme devrait fonctionner pour toutes les images et entrées valides.

Image de citrons

Largeur = 52, hauteur = 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'       
          '---' --- '          

Largeur: 70, Hauteur: 3:

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

Patates

Largeur: 50, Hauteur: 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 *** -         
                               «------»           




Échantillon de clipart

Largeur: 26, Hauteur: 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» -  
               «---       

C'est le , donc la réponse la plus courte l'emporte.

es1024
la source
2
c'est un défi paralysant tranquille .... ....
Abr001am
Quand vous dites entrée d'image, voulez-vous dire un nom de fichier? Ou les données d'image réelles?
sirpercival
@sirpercival est très bien
es1024

Réponses:

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
}

Exemples:

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

Citrons:

            .--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***-         
                               '------'           

Smoking:

                       ,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 "--  
               '---       
marteau-de-loup
la source
2

IDL 8.3, 588 597 588 octets

Je reçois des valeurs légèrement différentes de vous, je ne sais pas pourquoi ... J'ai fait une division entière pour tout. Mais cela fonctionne à merveille sinon ... ces résultats sont-ils acceptables? Bien mieux maintenant, mais toujours pas identique pour une raison quelconque.

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

Cas de 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 "-"  
                --"       
sirpercival
la source