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

Conmajia 2012-10-13 01:59:22
源代码:下载

很久没玩编程了。今天来个简单的: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表示,基本原理和这个差不多,各位可以自己玩玩看。。

源代码在楼顶下载。不要找我要。
...全文
664 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
----_____---- 2014-03-25
  • 打赏
  • 举报
回复
引用 20 楼 conmajia 的回复:
字符画
so cool
Conmajia 2013-09-08
  • 打赏
  • 举报
回复

字符画
far-away-wind 2013-09-08
  • 打赏
  • 举报
回复
不错,很有意思!很有新意
Conmajia 2013-06-18
  • 打赏
  • 举报
回复
字符画
Conmajia 2013-01-27
  • 打赏
  • 举报
回复


字符画。。。
卧_槽 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

好好的小罗莉被你转得像鬼一样
[/Quote]
看来给你开的药又没全吃了。。。
卧_槽 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

虽然不是第一次见字符画,但是第一次听用编程的方式话,野比竟然说是炒别人的冷饭,看来我有点凹凸了
[/Quote]
很多很多年以前,应该还是在dos的时代,就有程序员用字母拼成love跟人求爱了。得站远点才看得出来。
Conmajia 2012-10-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

虽然不是第一次见字符画,但是第一次听用编程的方式话,野比竟然说是炒别人的冷饭,看来我有点凹凸了
[/Quote]各种.nfo文件里大量的字符画。。
馒头仔 2012-10-15
  • 打赏
  • 举报
回复
虽然不是第一次见字符画,但是第一次听用编程的方式话,野比竟然说是炒别人的冷饭,看来我有点凹凸了
panziyu_tody 2012-10-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

好好的小罗莉被你转得像鬼一样
[/Quote]
可是OKGOOOD你会做么?你每天除了拿着枚举和复制粘贴你还会什么?喷人请有点实力,心疼你的人生。
Conmajia 2012-10-14
  • 打赏
  • 举报
回复
本来打算优化一下做成实时视频转换的。。不过聆听了“大湿的教诲”,就算了。。哈哈。。
Conmajia 2012-10-13
  • 打赏
  • 举报
回复
最近潜水。。
缭绕飘渺 2012-10-13
  • 打赏
  • 举报
回复
楼主最近好像消失了一段
点耐特之王 2012-10-13
  • 打赏
  • 举报
回复
好好的小罗莉被你转得像鬼一样
dalmeeme 2012-10-13
  • 打赏
  • 举报
回复
楼主人才,什么都会~~
事理 2012-10-13
  • 打赏
  • 举报
回复
很有才
Conmajia 2012-10-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
好好的小罗莉被你转得像鬼一样
[/Quote]哟。。还活着那?今天疗程结束啦?
csdn_风中雪狼 2012-10-13
  • 打赏
  • 举报
回复
不错,谢谢分享
oh51888 2012-10-13
  • 打赏
  • 举报
回复
哈哈 楼主有才了 挺不错 挽之 ~~~
oh51888 2012-10-13
  • 打赏
  • 举报
回复

unsafe public void SetPixel(int x, int y, Color c)
{
if (_bitmapData.PixelFormat == PixelFormat.Format32bppArgb)
{
byte* b = (byte*)_bitmapData.Scan0 + (y * _bitmapData.Stride) + (x * 4);
*b = c.B;
*(b + 1) = c.G;
*(b + 2) = c.R;
*(b + 3) = c.A;
}
if (_bitmapData.PixelFormat == PixelFormat.Format24bppRgb)
{
byte* b = (byte*)_bitmapData.Scan0 + (y * _bitmapData.Stride) + (x * 3);
*b = c.B;
*(b + 1) = c.G;
*(b + 2) = c.R;
}
}
加载更多回复(1)

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧