将图片转为ASCII字符画

原文: 将图片转为ASCII字符画

Copyright 2012 Conmajia

源代码下载:点击这里

什么是字符画?就是用ASCII字符来近似组成图像,就像这样:

  ╭╮       ╭╮    
 ││       ││    
╭┴┴———————┴┴╮  
│           │     
│           │     
│ ●       ● │  
│○  ╰┬┬┬╯  ○│  
│    ╰—╯    │   
╰——┬O———O┬——╯  
   ╭╮    ╭╮      
   ╰┴————┴╯ 

还有复杂点的:

﹎ ┈ ┈ .o┈ ﹎  ﹎.. ○
﹎┈﹎ ●  ○ .﹎ ﹎o▂▃▅▆
┈ ┈ /█\/▓\ ﹎ ┈ ﹎﹎ ┈ ﹎ 
▅▆▇█████▇▆▅▃▂┈﹎
 
                    .----.
                 _.'__    `. 
             .--(#)(##)---/#\
           .' @          /###\
           :         ,   #####
            `-..__.-' _.-\###/  
                  `;_:    `"'
                .'"""""`. 
               /,  野比 ,\
              //  很穷!  \\
              `-._______.-'
              ___`. | .'___ 
             (______|______)

今天要做的就是把一副图片(卡通动画,照片)转换成类似这样的效果。

相信很多人都做过,我这里就简单提一下。

基本思想就是用不同“亮度”的字符(每个字符有自己对应的视觉亮度)替换图片中对应亮度的那些部分,最后形成和原图亮度分布差不多的“看起来很像”的字符画。
核心代码很简单,不到50行。为了图方便我没有把原图切块后的Blob保存下来,这个供大家自行发挥。
注意其中用到了FastBitmap,这个增强Bitmap类以前我发的代码里也有,用来稍微加快下处理速度。如果觉得不方便,直接删除带有「fast」的语句就可以,不用做其他修改。

 1 public static string Generate(Bitmap img, int rowSz, int colSz)
 2 {
 3     StringBuilder sb
 4         = new StringBuilder(
 5         img.Width / colSz * img.Height / rowSz
 6         );
 7     FastBitmap fast
 8         = new FastBitmap(
 9         img
10         );
11 
12     fast.Lock();
13     for (int h = 0; h < img.Height / rowSz; h++)
14     {
15         int yoffset = h * rowSz;
16         for (int w = 0; w < img.Width / colSz; w++)
17         {
18             int xoffset = w * colSz;
19             int br = 0;
20 
21             for (int y = 0; y < 10; y++)
22                 for (int x = 0; x < 10; x++)
23                     try
24                     {
25                         Color c = fast.GetPixel(
26                             x + xoffset,
27                             y + yoffset);
28                         br =
29                             br + (int)(c.GetBrightness() * 10);
30                     }
31                     catch
32                         br += 10;
33             br /= 10;
34             if (br / 5 < charset.Length)
35                 sb.Append(
36                     charset[br / 5]);
37             else
38                 sb.Append(' ');
39         }
40         sb.AppendLine();
41     }
42     fast.Unlock();
43 
44     return sb.ToString();
45 }

其实最关键部分在于使用的调色盘,转换结果好不好,全靠Palette。不过由于时间关系,我随便弄了个对付对付。。
使用程序时先Load图片(注意别太大,如果太大,需要增大w和h来减少分块数量,否则会很慢)。然后设定好分块大小(单个块),最后点击「Generate」按钮。程序会在桌面上生成一个临时文件(HTML格式),并在浏览器中打开文件,供你查看结果。



下面是转换效果(可以看到糟糕的调色盘配置)

网上老外还有做成支持彩色的字符画,也是基于HTML表示,基本原理和这个差不多,各位可以自己玩玩看。。

你甚至还可以做成动画,就像这样。你懂的。

(完)

Copyright 2012 Conmajia

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值