ASCII艺术生成


13

任务

编写一个程序或函数,该程序或函数获取一个宽度w和高度为h2的整数a <= w/2b <= h/2的图像,并输出该图像的图像,其尺寸为ax b

应该通过以下步骤(或具有相同输出的其他过程)生成ascii艺术:

  1. wx h图像调整为2ax 2b(x, y)调整大小后的图像中像素的颜色应等于矩形内具有以下角的原始图像中所有像素的颜色平均值:

    (floor[x * w/2a], floor[y * h/2b])
    (ceil[(x+1) * w/2a], ceil[(y+1) * h/2b])
    
  2. 调整大小后的图像应通过获取颜色的红色,绿色和蓝色分量的平均值,然后将每个分量设置为该平均值来降低饱和度。

  3. 应按照以下规则为每个2x2像素块输出一个字符:

    • e = 3 - floor[color/64],其中color表示左上方像素的红色分量(在0..255范围内)。让fgh引用此值,但分别用于右上,左下和右下像素。
    • z是平均的efgh
    • 输出与以下字符相对应的字符(白色代表3 - floor[color/64]零像素,灰色代表非零像素)。
    • 所有像素均为零=输出一个空格(
    • 左上像素不为零右上角像素不为零=输出"如果e (or f) >= 2'其它。
    • 左下像素不为零右下角像素不为零=输出,如果g (or h) >= 2.其它。
    • 最高像素非零底部像素非零=输出-
    • 左像素非零右像素非零=输出;
    • 左上,右下像素非零 =输出 \
    • 右上,左下像素非零 =输出 /
    • 左上像素零 =输出 J
    • 右上角像素为零 =输出 L
    • 左下像素零 =输出 7
    • 右下角像素为零 =输出 P
    • 全部非零
      • z = 1:输出*
      • z = 2:输出C
      • z = 3:输出#

其他说明:在上述步骤中获得的所有平均值均应使用整数除法(即四舍五入为0)。

您可以使用库来读取图像,但是库不能用于调整大小和降低饱和度的步骤。

输入值

您的程序将接收三段数据:

  • 一个图像。该图像可以是您选择的任何格式(例如PNG,PPM)
  • ascii艺术的宽度(以字符数为单位)
  • ascii艺术的高度(以字符数为单位)

输入可以通过STDIN读取,作为命令行参数传递,存储为变量等。

输出量

您的程序将通过上述过程输出从图像生成的图像。每行必须具有相同的宽度(作为输入传递的宽度),并且不得添加或删除多余的空格。最后一行可能包含尾随换行符,但这不是强制性的。空行(只有空格的行)一定不能省略。

例子

所有图像均取自Wikipedia,并已发布到公共领域。您的程序应适用于所有图像和有效输入。

柠檬的图片

宽度= 52,高度= 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'       
          '---'---'          

宽度:70,高度:3:

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

土豆

宽度:50,高度: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 ***-         
                               '------'           




剪贴画样本

宽度:26,高度: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; ; CCCCCCCCCCCCCC
; **** J ** L; CCCCCCCCCCCC
; *******; 'CCCCCCCCCCCCCP
'*******'CCCCCCCCCCC'
 '* P-7 *'“ CCCCP'-  
               '-       

这是,因此最短的答案将获胜。


2
多数民众赞成在安静的
残酷

说图像输入时,您是指文件名吗?还是实际的图像数据?
sirpercival,2015年

@sirpercival都很好
es1024 2015年

Answers:


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
}

例子:

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

柠檬:

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

短钉:

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

晚礼服:

                       ,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字节

我得到的值与您的值略有不同,我不确定为什么...我对所有内容都进行了整数除法。但是,否则效果很好……这些结果可以接受吗?现在好多了,尽管由于某些原因仍不相同。

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

测试用例:

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 "-"  
                --"       
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.