|
本帖最后由 tigerA15 于 2014-4-10 16:00 编辑
终于找到BMP的原始像素的储存地址了,相对于scanline,我更愿意用一层循环去完成像素的转换...
procedure fpGrayscale2(const Bitmap: TBitmap; YuvConvert: boolean);
var
PRGB: pRGBTriple;
size, y, x, gray: integer;
begin
Bitmap.BeginUpdate(); //beginupdate和endupdate必须要加在lazarus上才会生效,在delphi下则不需要,奇了个怪 ^_^
try
PRGB := pRGBTriple(Bitmap.RawImage.Data);
size := Bitmap.RawImage.DataSize div 3;
if (YuvConvert) then
begin
for y := 0 to size - 1 do
begin
gray := (77 * PRGB^.rgbtRed + 151 * PRGB^.rgbtGreen + 28 *
PRGB^.rgbtBlue) shr 8;
PRGB^.rgbtRed := Gray;
PRGB^.rgbtGreen := Gray;
PRGB^.rgbtBlue := Gray;
Inc(PRGB);
end;
end
else
begin
for y := 0 to size - 1 do
begin
gray := (PRGB^.rgbtRed + PRGB^.rgbtGreen + PRGB^.rgbtBlue) div 3;
PRGB^.rgbtRed := Gray;
PRGB^.rgbtGreen := Gray;
PRGB^.rgbtBlue := Gray;
Inc(PRGB);
end;
end;
finally
Bitmap.EndUpdate();
end;
end;
因为直接对内存中的像素操作,所以转换速度非常快。
|
|