左轻侯教教我:如何实现将BMP图象转换为ASCII字符???(200分)

  • 主题发起人 主题发起人 崇拜者
  • 开始时间 开始时间

崇拜者

Unregistered / Unconfirmed
GUEST, unregistred user!
左大虾,您好!
有幸浏览了你的主页,看到一个能将BMP图象转换为ASCII字符的软件,很感兴趣!
能不能提供一点算法或者源码给我!万分感谢!!!
 
必须是被你称作为“左大虾”的人,
才能回答你所提出的问题吗?
 
这个你将图片上的点不同的颜色用不同的字母来代替就可以了。
 
呵呵
想起了Base64编码
 
我回答给分吗?
以下是丛别处找的,应该是你想要的东西
看看我的,请多指教呀~~有更好的希望大家不要保守哟~~

procedure TForm1.FormCreate(Sender: TObject);
var strlines:string;
i,j:integer;
begin
//分辨率800*600及以上
form1.WindowState:= wsMaximized;
image1.autosize:=true;
with memo1 do begin
lines.clear;
align:=alclient;
font.Name:='宋体';
font.size:=5;
scrollbars:=ssboth;
end;
{with Image1.Canvas do begin
with Font do begin
Name:='华文彩云';
Style:=[fsBold];
Size:=18;
end;
TextOut(0,10,'颜鑫');
end;}
//请先在image1中加入bmp图片
for i:=0 to image1.height do
BEGIN
strLines:='';
for j:=1 to image1.width do
//好像只支持bmp
case GetRValue(Image1.Canvas.Pixels[j,i])+GetGValue(Image1.Canvas.Pixels[j,i])+GetBValue(Image1.Canvas.Pixels[j,i])of
//十级图像灰度
//希望能得到更理想的字符来表示图像的灰度
000..075: strLines:=strLines+'M';
076..150: strLines:=strLines+'B';
151..225: strLines:=strLines+'A';
226..300: strLines:=strLines+'@';
301..375: strLines:=strLines+'9';
376..450: strLines:=strLines+'3';
451..525: strLines:=strLines+'+';
526..600: strLines:=strLines+':';
601..675: strLines:=strLines+',';
676..765: strLines:=strLines+'.';
end;
//另一种方法,不知为何效果更差?希望你能解释解释。
{case Image1.Canvas.Pixels[j,i] of
$000000..$191919: strLines:=strLines+'M'; //000..025
$1a1a1a..$323232: strLines:=strLines+'B'; //026..050
$333333..$4b4b4b: strLines:=strLines+'A'; //051..075
$4c4c4c..$646464: strLines:=strLines+'@'; //076..100
$656565..$707070: strLines:=strLines+'9'; //101..125
$717171..$969696: strLines:=strLines+'3'; //126..150
$979797..$afafaf: strLines:=strLines+'+'; //151..175
$b0b0b0..$c8c8c8: strLines:=strLines+':'; //176..200
$c9c9c9..$e1e1e1: strLines:=strLines+','; //201..225
$e2e2e2..$ffffff: strLines:=strLines+'.'; //226..255
end;}
memo1.Lines.Add(strLines);
end;
end;
 
源代码我已经上传
http://lover-lover.51.net/Brush.zip
 
首先将位图分成同样大小的小块,求出每一块灰度的平均值,然后和每个字符的灰度做比较,
找出最接近的那个字符,来代表这一小块图象。那么,怎么确定字符的灰度呢?
做下面的实验就明白了。打开notepad,输入字符"1",选定该字符,使其反色。
按Alt+PrintScreen键拷贝窗口屏幕。打开paintbrush,粘贴,然后把图放到最大(*8),
打开"查看"->"缩放"->"显示网格"菜单,这时数数字符"1"用了几个点?是22个。我想你已经明白了,
字符的灰度和它所占的黑色点数有关,点越少,灰度值越大,空格字符的灰度最大,为全白,因为它一个黑点也没有;而字符"W"的灰度值就比较低了。每个字符的面积是8*16(宽*高),所以一个字符的灰度值可以用如下的公式计算(1-所占的黑点数/(8*16))*255。下面是可显示的字符,及对应的灰度,共有95个
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部