我正在使用 Delphi 2009,我想缩放一个图像,以适应可用的空间。图像总是显示小于原来的。问题是TImage拉伸属性没有做好工作,并损害了图片的可读性。
(来源:xrw.bc.ca)我希望看到它像这样缩放:
(来源:xrw.bc.ca)有什么建议吗?尝试过JVCL,但它似乎没有这个功能。一个免费的库会很好,但也许有一个低成本的库,做“只有”这将是很好的。
4dc9hkyq1#
你真的,真的想使用Graphics32。
procedure DrawSrcToDst(Src, Dst: TBitmap32); var R: TKernelResampler; begin R := TKernelResampler.Create(Src); R.Kernel := TLanczosKernel.Create; Dst.Draw(Dst.BoundsRect, Src.BoundsRect, Src); end;
在对图像进行重采样时,你有几种方法和过滤器可供选择。上面的例子使用了一个内核重采样器(有点慢,但效果很好)和一个Lanczos过滤器作为重建内核。上面的例子应该适合你。
ws51t4hk2#
如果你恢复使用Win32 API调用,你可以使用SetStretchBltMode到HALFTONE和使用StretchBlt。我不确定这是否是使用默认的 Delphi 调用提供的,但这是我通常解决这个问题的方法。更新(2014-09)**刚才我也是类似情况(再次)在TScrollBox中有一个TIimage,表单上有很多内容,真的很想让Image1.Stretch:=true;做半色调。正如Rob所指出的,TBitmap.Draw使用HALFTONE only 当目标画布是8位/像素或更低,而源画布有更多...所以我'fixed'将Image1.Picture.Bitmap指定为下列其中之一:
Image1.Stretch:=true;
TBitmap.Draw
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;
aoyhnmkz3#
您可以尝试使用GraphUtil中的内置 Delphi ScaleImage
ykejflvf4#
我使用GDIPOB.pas的TGPGraphics类如果Canvas是TGPGraphics,Bounds是TGPRectF,NewImage是TGPImage示例:
Canvas.SetInterpolationMode(InterpolationModeHighQualityBicubic); Canvas.SetSmoothingMode(SmoothingModeHighQuality); Canvas.DrawImage(NewImage, Bounds, 0, 0, NewImage.GetWidth, NewImage.GetHeight, UnitPixel);
您可以通过更改插值模式来选择质量与速度系数
InterpolationModeDefault = QualityModeDefault; InterpolationModeLowQuality = QualityModeLow; InterpolationModeHighQuality = QualityModeHigh; InterpolationModeBilinear = 3; InterpolationModeBicubic = 4; InterpolationModeNearestNeighbor = 5; InterpolationModeHighQualityBilinear = 6; InterpolationModeHighQualityBicubic = 7;
和平滑模式:
SmoothingModeDefault = QualityModeDefault; SmoothingModeHighSpeed = QualityModeLow; SmoothingModeHighQuality = QualityModeHigh; SmoothingModeNone = 3; SmoothingModeAntiAlias = 4;
注意:这需要XP或更高版本,或者在安装程序中捆绑gdiplus.dll。
4条答案
按热度按时间4dc9hkyq1#
你真的,真的想使用Graphics32。
在对图像进行重采样时,你有几种方法和过滤器可供选择。上面的例子使用了一个内核重采样器(有点慢,但效果很好)和一个Lanczos过滤器作为重建内核。上面的例子应该适合你。
ws51t4hk2#
如果你恢复使用Win32 API调用,你可以使用SetStretchBltMode到HALFTONE和使用StretchBlt。我不确定这是否是使用默认的 Delphi 调用提供的,但这是我通常解决这个问题的方法。
更新(2014-09)**刚才我也是类似情况(再次)在TScrollBox中有一个TIimage,表单上有很多内容,真的很想让
Image1.Stretch:=true;
做半色调。正如Rob所指出的,TBitmap.Draw
使用HALFTONE only 当目标画布是8位/像素或更低,而源画布有更多...所以我'fixed'将Image1.Picture.Bitmap
指定为下列其中之一:aoyhnmkz3#
您可以尝试使用GraphUtil中的内置 Delphi ScaleImage
ykejflvf4#
我使用GDIPOB.pas的TGPGraphics类
如果Canvas是TGPGraphics,Bounds是TGPRectF,NewImage是TGPImage示例:
您可以通过更改插值模式来选择质量与速度系数
和平滑模式:
注意:这需要XP或更高版本,或者在安装程序中捆绑gdiplus.dll。