我正在使用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,Width,Height,ACanvas.CopyMode); end;