BMP位图 ( 积分: 20 )

  • 主题发起人 主题发起人 soulhuman
  • 开始时间 开始时间
S

soulhuman

Unregistered / Unconfirmed
GUEST, unregistred user!
一张有文字的单色图片
文字是一种颜色,背景图片是一种颜色,
现在想将原来的每个象素显示文字的部分用1表示,显示图片的部分用0表示
0000000000000000
0000100000000000
0000100000000000
0000100000000000

类似这样
原来的图片是16位图,每个象素占16bit即2个字节

这个替换程序怎样写啊??
大家帮帮忙!
 
一张有文字的单色图片
文字是一种颜色,背景图片是一种颜色,
现在想将原来的每个象素显示文字的部分用1表示,显示图片的部分用0表示
0000000000000000
0000100000000000
0000100000000000
0000100000000000

类似这样
原来的图片是16位图,每个象素占16bit即2个字节

这个替换程序怎样写啊??
大家帮帮忙!
 
以一张只有Red和Blue两种颜色的Bmp为例:
var
aBmp :TBitmap;
i, j :integer;
W, H :integer;
arr :array of array of 0..1;
begin
aBmp :=TBitmap.Create;
aBmp.LoadFromFile('/test.bmp');
W :=aBmp.Width;
H :=aBmp.Height;
SetLength(arr,W,H);
for i :=0 to W-1 do
begin
for j :=0 to H-1 do
begin
if aBmp.Canvas.Pixels[i,j] = clRed then
arr[i,j] :=0
else if aBmp.Canvas.Pixels[i,j] = clBlue then
arr[i,j] :=1;
end;
end;
end;//可以对数组中的数据作后继处理,如存入文件(得到一副特定字符表示的图像)
 
遍历图片的每一个象素,根据该象素的颜色,分别用1或者0记录下来;
建议使用TStrings。
 
to royal1442

能不能贴出来代码看看啊??

另外转化后,要把这些由0,1组成的象素,转为16进制。
 
procedure TForm1.Button1Click(Sender: TObject);
var
i, j : integer;
StrRow : string;
Total : TStrings;
begin
Total := TStringList.Create;
try
for i := 0 to (Image1.Canvas.ClipRect.Bottom- Image1.Canvas.ClipRect.Top -1) do
begin
StrRow := '';
for j := 0 to (Image1.Canvas.ClipRect.Right - Image1.Canvas.ClipRect.Left -1) do
begin
if Image1.Canvas.Pixels[i, j] = clWhite then
StrRow := StrRow + '0'
else
StrRow := StrRow + '1'
end;
Total.Add(StrRow);
end;
finally
Total.Free;
end;
end;
 
多人接受答案了。
 
后退
顶部