如何把彩色的BMP文件转换成黑白位图BMP文件?(100分)

  • 主题发起人 主题发起人 ncutzcb
  • 开始时间 开始时间
N

ncutzcb

Unregistered / Unconfirmed
GUEST, unregistred user!
如何把彩色的BMP文件转换成黑白位图BMP文件?要求能够缩放。
 
BmpNow := TBitmap.Create;
...
BmpNow.PixelFormat := pf1bit;
 
用StretchBlt函数拷贝并完成缩放。
 
这个方法失真比较严重。不是太理想。
望哪位大侠能够不吝赐教一番,奉送100分。
 
如果只剩两种颜色的话,失真是肯定的。
 
bitblt函数好像可以的
 
也许是我没有把问题说清楚。
目前手中有个工程,需要将视频卡捕获得图象(彩色的)转化为黑白的,
当然是有灰度的,所以远帆同志的方法似乎不是太好。
使用Bitblt函数,我不是很会。
最好请大侠详细地说明一下
 
不用试bitblt了。bitblt没有缩放功能。
如果不是自已进行插值,不会有什么更好的方法。
 
不好意思,bitblt不能做到,以下这段可以将转换JPEG的图片,可以缩放
with TJPEGImage(Image1.Picture.Graphic) do
begin
PixelFormat := TJPEGPixelFormat(0);
Scale := TJPEGScale(1);//缩放值
Grayscale := Boolean(1);
Performance := TJPEGPerformance(0);
ProgressiveDisplay := false;
end;
 
你的提问本身就是错误的;
应该是转化为灰度图。
黑白图只有2色的!

在Image上加载一幅位图.

procedure TForm1.Button1Click(Sender: TObject);
var
p :PByteArray;
Gray,x,y :Integer;
Bmp :TBitmap;
begin
Bmp :=TBitmap.Create;
Bmp.Assign(Image1.Picture.Bitmap);
Bmp.PixelFormat :=pf24Bit;
for y:=0 to Bmp.Height-1 do
begin
p:=Bmp.scanline[y];
for x:=0 to Bmp.Width-1 do
begin
Gray:=Round(p[x*3+2]*0.3+p[x*3+1]*0.59+p[x*3]*0.11);
p[x*3]:=Gray;
p[x*3+1]:=Gray;
p[x*3+2]:=Gray;
end;
end;
Image1.Picture.Bitmap.Assign(Bmp);
Bmp.Free;
end;

缩放 : StretchBlt(......);
自己去搜索以前的帖子 .
 
下面是我自己找到的解决方法,虽然卷起千堆雪tyn的解答与我的很相似,我还是非常感谢。
100分奉送!
var
lo:tbitmap;
i,j:integer;
kl:longint;
rr,gg,bb:byte;
res:byte;
begin
lo:=tbitmap.create;
lo.Width:=image1.Picture.Bitmap.Width;
lo.height:=image1.Picture.Bitmap.height;
ProgressBar1.Max:=image1.Picture.Bitmap.Width+1;
for i:=0 to image1.Picture.Bitmap.Width+1 do
begin
for j:=0 to image1.Picture.Bitmap.height+1 do
begin
kl:=ColorToRGB(image1.Canvas.Pixels[i,j]);
rr:=byte(kl);
gg:=byte(kl shr 8);
bb:=byte(kl shr 8);

res:=round(0.3*rr+0.59*gg+0.11*bb);
lo.Canvas.Pixels[i,j]:=rgb(res,res,res);
end;
ProgressBar1.Position:=i;
end;//for do
image1.Canvas.Draw(0,0,lo);
lo.free;
end;
 

Similar threads

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