图片转ascii字符画C语言,将图片转为ASCII字符画

Copyright 2012 Conmajia

[ARCHIVE]

源代码下载:点击这里

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

╭╮       ╭╮

││       ││

╭┴┴———————┴┴╮

│           │

│           │

│ ●       ●  │

│○  ╰┬┬┬╯  ○ │

│    ╰—╯    │

╰——┬O———O┬——╯

╭╮    ╭╮

╰┴————┴╯

还有复杂点的:

.----.

_.'__ `.

.--(#)(##)---/#\

.' @ /###\

: , #####

`-..__.-' _.-\###/

`;_: `"'

.'"""""`.

/, 野比 ,\

// 很穷! \\

`-._______.-'

___`. | .'___

(______|______)

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

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

基本思想就是用不同“亮度”的字符(每个字符有自己对应的视觉亮度)替换图片中对应亮度的那些部分,最后形成和原图亮度分布差不多的“看起来很像”的字符画。

核心代码很简单,不到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格式),并在浏览器中打开文件,供你查看结果。

0818b9ca8b590ca3270a3433284dd417.png

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

0818b9ca8b590ca3270a3433284dd417.png

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

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

0818b9ca8b590ca3270a3433284dd417.png

(完)

Copyright 2012 Conmajia

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值