「玩一玩」将图像转换为ASCII字符画

Conmajia Conmajia 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
源代码:下载

很久没玩编程了。今天来个简单的:ASCII字符画
相信很多人都做过,我继续来炒冷饭。
什么是字符画?就是用ASCII字符来近似组成图像,就像这样:



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


还有复杂点的:

陪你看日出


﹎ ┈ ┈ .o┈ ﹎ ﹎.. ○
﹎┈﹎ ● ○ .﹎ ﹎o▂▃▅▆
┈ ┈ /█\/▓\ ﹎ ┈ ﹎﹎ ┈ ﹎
▅▆▇█████▇▆▅▃▂┈﹎



SNOOPY
.----.
_.'__ `.
.--(#)(##)---/#\
.' @ /###\
: , #####
`-..__.-' _.-\###/
`;_: `"'
.'"""""`.
/, 野比 ,\
// 很穷! \\
`-._______.-'
___`. | .'___
(______|______)



今天要做的就是把一副图片(卡通动画,照片)转换成类似这样的效果。
基本思想就是用不同“亮度”的字符(每个字符有自己对应的视觉亮度)替换图片中对应亮度的那些部分,最后形成和原图亮度分布差不多的“看起来很像”的字符画。
核心代码很简单,不到50行。为了图方便我没有把原图切块后的Blob保存下来,这个供大家自行发挥。
注意其中用到了FastBitmap,这个增强Bitmap类以前我发的代码里也有,用来稍微加快下处理速度。如果觉得不方便,直接删除带有「fast」的语句就可以,不用做其他修改。
public static string Generate(Bitmap img, int rowSz, int colSz)
{
StringBuilder sb
= new StringBuilder(
img.Width / colSz * img.Height / rowSz
);
FastBitmap fast
= new FastBitmap(
img
);

fast.Lock();
for (int h = 0; h < img.Height / rowSz; h++)
{
int yoffset = h * rowSz;
for (int w = 0; w < img.Width / colSz; w++)
{
int xoffset = w * colSz;
int br = 0;

for (int y = 0; y < 10; y++)
for (int x = 0; x < 10; x++)
try
{
Color c = fast.GetPixel(
x + xoffset,
y + yoffset);
br =
br + (int)(c.GetBrightness() * 10);
}
catch
br += 10;
br /= 10;
if (br / 5 < charset.Length)
sb.Append(
charset[br / 5]);
else
sb.Append(' ');
}
sb.AppendLine();
}
fast.Unlock();

return sb.ToString();
}


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


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



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

源代码在楼顶下载。不要找我要。
...全文

相关推荐

评论 21
收藏 已收藏
分享
返回顶部
Conmajia
C# 111,129 成员 642,539 内容