在Delphi中很好地缩放图像?

我正在使用Delphi 2009,我想缩放图像以适应可用空间.图像始终显示为小于原始图像.问题是TImage Stretch属性不会做得很好,损害了图片的可读性.

ugly way http://xrw.bc.ca/download/so/TImageStretch.gif

我想看到它比较这样:

nicer way http://xrw.bc.ca/download/so/NicerTImageStretch.png

任何建议如何最好地做到这一点?试过JVCL,但似乎没有这种能力.一个免费的图书馆会很好,但也许有一个低成本的图书馆,“只有”这也将是好的.

如果你回到使用Win32 API调用,你可以使用SetStretchBltMode到HALFTONE并使用StretchBlt.我不知道这是否使用默认的Delphi调用提供,但这是我通常解决这个问题的方式.

更新(2014-09)刚才我处于类似的情况(又一次),在TScrollBox中有一个TImage,在表单上有更多的事情,真的想要Image1.Stretch:= true;做半色调正如Rob指出的那样,TBitmap.Draw只有当目标画布是每像素8位或更低,源画布更多时才使用HALFTONE …所以我通过将Image1.Picture.Bitmap分配给其中之一来修复它代替:

TBitmapForceHalftone=class(TBitmap)
protected
  procedure Draw(ACanvas: TCanvas; const Rect: TRect); override;
end;

{ TBitmapForceHalftone }

procedure TBitmapForceHalftone.Draw(ACanvas: TCanvas; const Rect: TRect);
var
  p:TPoint;
  dc:HDC;
begin
  //not calling inherited; here!
  dc:=ACanvas.Handle;
  GetBrushOrgEx(dc,p);
  SetStretchBltMode(dc,HALFTONE);
  SetBrushOrgEx(dc,p.x,p.y,@p);
  StretchBlt(dc,
    Rect.Left,Rect.Top,
    Rect.Right-Rect.Left,Rect.Bottom-Rect.Top,
    Canvas.Handle,0,0,Width,Height,ACanvas.CopyMode);
end;
http://stackoverflow.com/questions/1976116/scale-an-image-nicely-in-delphi

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:在Delphi中很好地缩放图像?