(200全给您!)怎样将24位BMP转化为2位BMP(200分)

  • 主题发起人 主题发起人 ptfjy
  • 开始时间 开始时间
P

ptfjy

Unregistered / Unconfirmed
GUEST, unregistred user!
在win98“画图”软件中, 在width:110 , height:110 的白纸上,
画一个“黑色”的圆。保存BMP文件时, 发现文件大小为36K,
如将此文件用“画图”软件打开, 进入“图像”菜单的“属性”处。
选择颜色为“黑白”,保存发现其文件大小仅为2K。
因为我要保存的图像其实只有“黑白”两色,并且有大量的图片要保存到数据库中,
所以希望图像越小越好。
 
procedure TForm1.BitBtn1Click(Sender: TObject);
var
b:TBitmap;
begin
b:=TBitmap.create;
b.LoadFromFile('d:/temp/bomber/back.bmp');
b.PixelFormat:=pf1bit;
b.SaveToFile('d:/temp/bomber/back2.bmp');
b.free;
end;
 
jsxjd:你好!
刚才我试过了, 发现图像确实为2K, 但“白底色”变成了“深红色”,
不知怎么会事, 请解答。

 
有谁能帮我解决上面的问题?
本人急需解决上面的问题, 答正确马上给200分。
 
type
TPalette = record
palVersion: Word;
palNumEntries: Word;
palPalEntry: array[0..1] of TPaletteEntry;
end;

.....

procedure TForm1.Button1Click(Sender: TObject);
var
b:TBitmap;
Pal: TPalette;
begin
Pal.palVersion := $300;
Pal.palNumEntries := 2;
with Pal.palPalEntry[0] do begin
peRed := 0;
peGreen := 0;
peBlue := 0;
peFlags := 0;
end;
with Pal.palPalEntry[1] do begin
peRed := 255;
peGreen := 255;
peBlue := 255;
peFlags := 0;
end;

b:=TBitmap.create;
b.LoadFromFile('c:/temp/temp.bmp');
b.Palette:= CreatePalette(PLogPalette(@Pal)^);
b.PixelFormat:=pf1bit;
b.SaveToFile('c:/temp/temp1.bmp');
b.free;
end;

参考
请问如何将绘在画布上的黑白图象保存为黑白格式的BMP位图
http://www.delphibbs.com/delphibbs/dispq.asp?lid=523233
 
QuickSilver:你好!
我的程序里, 需要直接从DBimage1经“黑白”处理后直接保存到DBimage2中去。
请详细告知!
 
本人遇到的问题是这样的:
数据库中保存图片数量很大, 但是图片只有“黑白”两色。
所以, 希望将数据库中的图片经处理后压缩保存在另一个图像字段中。
 
卷大虾的源码:
利用Monochrome将彩色位图转换为黑白位图时,将丢失
大量的颜色信息,所以你首先应该转换为灰度图,再转换为16色图,最后才是2色图!
procedure TForm1.Button1Click(Sender: TObject);
var
p: PByteArray;
w: Integer;
i, j: Integer;

begin
image1.Picture.LoadFromFile('e:/图片/end004.bmp');
image1.Picture.bitmap.pixelformat := pf24bit;
for i := 0 to image1.Picture.bitmap.height - 1 do
begin
p := image1.Picture.bitmap.scanline;
for j :=0 to image1.Picture.bitmap.width-1 do
begin
w :=(p[3*j] * 28 + p[3*j+1] * 151 + p[3*j+2]*77);//转换为灰度图
w := w shr 6;
p[3*j] := byte(w);
p[3*j+1] := byte(w);
p[3*j+2] := byte(w);
end;
end;
image1.Picture.bitmap.pixelformat := pf4bit;//转换为16色图
image1.Picture.bitmap.Monochrome:=true;//转换为2色图
end;
 
我试过QuickSilver代码, 确实可以将其转换成2图, 只是希望能直接在DBimg之间转换。
 
我的问题解决了!
 
后退
顶部