将图片转换为8bit灰度图片
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//将图片转换为8bit灰度图片
procedure ConvertImgType(var bitmapSrc:Tbitmap);
var
pixelNum : integer;
bitmap : Tbitmap;
lplogpal:pMaxLogPalette;//pointer of TMaxLogPalette
i,j : integer;
ppSrc,ppDest:pbyteArray;
begin
pixelNum := 1;
case bitmapSrc.PixelFormat of
pf32bit: pixelNum := 4;
pf24bit: pixelNum := 3;
else exit;
end;
///
bitmap := TBitmap.Create;
// bitmap.Assign(bitmapSrc);
bitmap.PixelFormat := pf8bit;
bitmap.Width := bitmapsrc.Width;
bitmap.Height := bitmapsrc.Height;
GetMem(lpLogPal,sizeof(TLOGPALETTE) + ((255) * sizeof(TPALETTEENTRY))); //创建系统调色板
lpLogPal.palVersion := $0300;
lpLogPal.palNumEntries := 256;
for i := 0 to 255 do
begin
lpLogPal.palPalEntry[i].peRed := i;
lpLogPal.palPalEntry[i].peGreen := i;
lpLogPal.palPalEntry[i].peBlue := i;
end;
bitmap.Palette := CreatePalette(pLogPalette(lpLogPal)^); //创建8位灰度图像显示调色板
FreeMem(lpLogPal,sizeof(TLOGPALETTE) + ((255) * sizeof(TPALETTEENTRY)));//}
for i := 0 to bitmapSrc.Height - 1 do
begin
ppSrc := bitmapSrc.ScanLine[i];
ppDest:= bitmap.ScanLine[i];
j := 0;
while j <= bitmapSrc.Width - 1 do
begin
ppDest[j] := trunc(ppSrc[j*PixelNum]*0.114 + ppSrc[j*pixelNum + 1]*0.587
+ ppSrc[j*PixelNum + 2]*0.299+0.5);
Inc(j);
end;
end;
bitmapsrc.Assign(bitmap);
bitmap.Free;
end;