首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

图片剪裁的三种方法,哪个更快更好

2012-09-24 
图片裁剪的三种方法,哪个更快更好?varbmpOld, bmpNew: TBitmapfn: stringrectDest, rectSource: TRecti

图片裁剪的三种方法,哪个更快更好?
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
[解决办法]
方法一就不错。

热点排行