图片裁剪的三种方法,哪个更快更好?
var
bmpOld, bmpNew: TBitmap;
fn: string;
rectDest, rectSource: TRect;
i, j, xOffset: integer;
P1, P2 : PByteArray;
begin
fn := ExtractFilePath(Application.ExeName) + 'Shot.bmp';
bmpOld := TBitmap.Create;
bmpNew := TBitmap.Create;
try
bmpOld.LoadFromFile(fn);
bmpOld.PixelFormat := pf24bit;
bmpNew.Height := bmpOld.Height;
bmpNew.Width := bmpNew.Height * 3 div 4; // 4:3 的比例
bmpNew.PixelFormat := pf24bit;
xOffset := (bmpOld.Width - bmpNew.Width) div 2;
{//方法一:
BitBlt(bmpNew.Canvas.Handle, 0, 0, bmpNew.Width - 1, bmpNew.Height - 1,
bmpOld.Canvas.Handle, xOffset, 0, SRCCOPY);}
//方法二:
{for J := 0 to bmpNew.Height - 1 do
begin
P1 := bmpNew.ScanLine[J];
P2 := bmpOld.ScanLine[J];
for I := 0 to bmpNew.Width - 1 do
begin
P1[3*I] := P2[3*(I + xOffset)];
P1[3*I+1] := P2[3*(I + xOffset) + 1];
P1[3*I+2] := P2[3*(I + xOffset) + 2];
end;
end;}
//方法三
rectDest := Rect(Point(0, 0), Point(bmpNew.Width - 1, bmpNew.Height - 1));
rectSource := Rect(Point((bmpOld.Width - bmpNew.Width) div 2, 0),
Point((bmpOld.Width - bmpNew.Width) div 2 + bmpNew.Width, bmpOld.Height -
1));
bmpNew.Canvas.CopyRect(rectDest, bmpOld.Canvas, rectSource);
bmpNew.SaveToFile(ExtractFilePath(Application.ExeName) + 'bmpNew.bmp');
finally
bmpNew.Free;
bmpOld.Free;
end;
end;
以上三种方法都能进行图片裁剪,但哪个更快更好呢?
我还发现一种现象,有的图片裁剪后颜色不失真,但有的图片颜色会失真(三种方法都失真)?不知道是为什么?
如果哪位需要测试的图片,留下 email ,我给您发过去
[解决办法]
BitBlt
[解决办法]
方法一就不错。