ASCII Art Generation

13

Aufgabe

Schreiben Sie ein Programm oder eine Funktion, die ein Bild mit Breite wund Höhe hsowie zwei Ganzzahlen a <= w/2und b <= h/2eine ASCII-Darstellung des Bildes mit den Abmessungen ax ausgibt b.

Die ASCII-Grafik sollte durch die folgenden Schritte (oder einen anderen Prozess mit derselben Ausgabe) generiert werden:

  1. Ändern Sie die Größe des wx- hBildes in 2ax 2b. Die Farbe des Pixels (x, y)im Bild mit geänderter Größe sollte dem Durchschnitt der Farben aller Pixel des Originalbilds innerhalb des Rechtecks ​​mit den folgenden Ecken entsprechen:

    (floor[x * w/2a], floor[y * h/2b])
    (ceil[(x+1) * w/2a], ceil[(y+1) * h/2b])
    
  2. Das verkleinerte Bild sollte entsättigt werden, indem der Durchschnitt der roten, grünen und blauen Komponenten der Farbe ermittelt und jede Komponente auf diesen Durchschnitt eingestellt wird.

  3. Für jeden 2x2 Pixelblock sollte ein Zeichen ausgegeben werden, wobei die folgenden Regeln zu beachten sind:

    • Lassen e = 3 - floor[color/64] Farbe auf die Rotkomponente der Farbe des linken oberen Pixels bezieht (im Bereich 0..255). Lassen Sie f, gund hbeziehen sich auf diesen Wert, aber für die oben rechts, unten links und unten rechts Pixel sind.
    • Sei zder Durchschnitt von e,f , g, h.
    • Geben Sie das folgende Zeichen aus (Weiß steht für ein Pixel mit 3 - floor[color/64]Null und Grau für einen Wert ungleich Null).
    • Alle Pixel sind Null = Leerzeichen ausgeben ( )
    • Das obere linke Pixel ist ungleich Nulloder Das obere rechte Pixel ist ungleich Null= Ausgabe "wenne (or f) >= 2 und 'sonst.
    • Das untere linke Pixel ist ungleich Nulloder Das untere rechte Pixel ist ungleich Null= Ausgabe ,wenng (or h) >= 2 und .sonst.
    • Top Pixel ungleich Null oder Die unteren Pixel sind ungleich Null = Ausgabe-
    • Linke Pixel ungleich Null oder Rechte Pixel ungleich Null = Ausgabe;
    • Oben links, unten rechts Pixel ungleich Null = Ausgabe \
    • Oben rechts, unten links Pixel ungleich Null = Ausgabe /
    • Oben links Pixel Null = Ausgabe J
    • Oben rechts Pixel Null = Ausgabe L
    • Unten links Pixel Null = Ausgabe 7
    • Unten rechts Pixel Null = Ausgabe P
    • Alles ungleich Null
      • z = 1: Ausgabe *.
      • z = 2: Ausgabe C.
      • z = 3: Ausgabe #.

Sonstige Hinweise: Bei allen in den obigen Schritten ermittelten Durchschnittswerten sollte eine Ganzzahldivision (dh eine Rundung auf 0) verwendet werden.

Sie können eine Bibliothek zum Lesen von Bildern verwenden, Bibliotheken werden jedoch möglicherweise nicht für die Größenänderungs- und Entsättigungsschritte verwendet.

Eingang

Ihr Programm nimmt drei Daten auf:

  • Ein Bild. Dieses Bild kann in jedem Format Ihrer Wahl sein (zB PNG, PPM)
  • Die Breite der ASCII-Kunst (in Anzahl der Zeichen)
  • Die Höhe der ASCII-Kunst (in Anzahl der Zeichen)

Die Eingabe kann über STDIN gelesen, als Befehlszeilenargument übergeben, als Variable gespeichert usw. werden.

Ausgabe

Ihr Programm gibt die ASCII-Kunst aus, die aus dem Bild und durch den oben beschriebenen Prozess generiert wurde. Jede Zeile muss dieselbe Breite haben (die als Eingabe übergebene Breite), und es dürfen keine zusätzlichen Leerzeichen hinzugefügt oder entfernt werden. Die letzte Zeile enthält möglicherweise einen nachgestellten Zeilenumbruch, dies ist jedoch nicht obligatorisch. Leerzeilen (Zeilen mit nur Leerzeichen) dürfen nicht ausgelassen werden.

Beispiele

Alle Bilder wurden aus Wikipedia entnommen und als gemeinfrei veröffentlicht. Es wird erwartet, dass Ihr Programm für alle Bilder und gültigen Eingaben funktioniert.

Bild von Zitronen

Breite = 52, Höhe = 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'       
          '---' --- '          

Breite: 70, Höhe: 3:

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

Kartoffeln

Breite: 50, Höhe: 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 *** -         
                               '------'           




Clipart-Beispiel

Breite: 26, Höhe: 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 '-  
               '---       

Das ist , also gewinnt die kürzeste Antwort.

es1024
quelle
2
das ist eine leise lähmende Herausforderung .... ....
Abr001am
Wenn Sie Bildeingabe sagen, meinen Sie einen Dateinamen? Oder die eigentlichen Bilddaten?
Sirpercival
@ Sirpercival entweder ist in Ordnung
es1024

Antworten:

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
}

Beispiele:

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

Zitronen:

            .--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 "--  
               '---       
Wolfhammer
quelle
2

IDL 8,3, 588 597 588 Bytes

Ich erhalte etwas andere Werte als Sie, ich bin mir nicht sicher, warum ... Ich habe für alles eine Ganzzahldivision durchgeführt. Aber sonst klappt es prächtig ... sind diese Ergebnisse akzeptabel? Jetzt viel besser, aber aus irgendeinem Grund immer noch nicht identisch.

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

Testfälle:

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
quelle