将图片转为ASCII字符画

简介: 原文:将图片转为ASCII字符画Copyright 2012 Conmajia 源代码下载:点击这里 什么是字符画?就是用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

目录
相关文章
|
C++
基于Qt的简易计算器设计与实现
基于Qt的简易计算器设计与实现
694 0
|
缓存 Linux Shell
Python 虚拟环境 看这一篇就够了
Python 虚拟环境 看这一篇就够了
4368 0
Python 虚拟环境 看这一篇就够了
|
11月前
|
移动开发 JavaScript 前端开发
"Vue开发者必看:一篇文章教你如何实现px自动转换vw或rem,轻松应对H5页面响应式设计挑战!"
【10月更文挑战第23天】在Vue项目中实现px到vw或rem的自动转换,可以使用PostCSS插件。首先安装`postcss-loader`,然后添加`postcss-px-to-viewport`和`postcss-pxtorem`插件,并在`postcss.config.js`中配置。配置完成后,直接在Vue组件中使用px单位编写样式,PostCSS会自动转换为vw或rem。这样可以简化开发流程,提高代码的可维护性和页面的响应式设计能力。
1103 0
|
安全 网络协议 网络安全
端口转发:解锁网络访问的新维度
端口转发技术,简化网络数据流,用于家庭至企业服务器场景。它隐藏内部网络服务,提供远程访问、个人网站公开、NAT穿透及安全的VPN连接。设置涉及路由器管理界面,添加转发规则,但需注意安全风险,仅开放必要端口并加强内部安全措施。了解和善用端口转发,提升网络服务可达性与安全性。
851 5
|
机器学习/深度学习 分布式计算
ICLR 2024:首个零阶优化深度学习框架
【2月更文挑战第28天】ICLR 2024:首个零阶优化深度学习框架
596 1
ICLR 2024:首个零阶优化深度学习框架
|
网络安全
完美解决 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
完美解决 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
3834 0
|
存储 运维 NoSQL
深入理解Redis集群模式、协议、元数据维护方式
深入理解Redis集群模式、协议、元数据维护方式
601 0
|
存储 关系型数据库 MySQL
MySQL删除外键、增加外键及删除主键、增加主键
MySQL删除外键、增加外键及删除主键、增加主键
217 0
IDEA 查看接口或类的继承实现关系图
IDEA 查看接口或类的继承实现关系图
900 0