在 Delphi 中很好地缩放图像?

问题描述 投票:0回答:5

我正在使用 Delphi 2009,我想缩放图像以适应可用空间。 显示的图像始终小于原始图像。 问题是 TImage Stretch 属性效果不佳,并且损害了图片的可读性。

ugly way
(来源:xrw.bc.ca

我希望看到它像这样缩放:

nicer way
(来源:xrw.bc.ca

有什么建议可以最好地做到这一点吗? 尝试过JVCL,但好像没有这个能力。 一个免费的图书馆会很好,但也许有一个低成本的图书馆“只”做这件事也很好。

delphi graphics image-scaling timage
5个回答
33
投票

真的非常想使用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 滤波器作为重建内核。上面的例子应该适合你。


17
投票

如果您恢复使用 Win32 API 调用,则可以使用 SetStretchBltMode 为 HALFTONE 并使用 StretchBlt。我不确定这是否是使用默认的 Delphi 调用提供的,但这就是我通常解决此问题的方式。

更新(2014-09) 刚才我(再次)处于类似的情况,并且在 TScrollBox 中有一个 TImage,表单上还有更多内容,并且真的想要

Image1.Stretch:=true;
进行半色调。正如 Rob 指出的那样,当目标画布为每像素 8 位或更低且源画布具有更多位时,
TBitmap.Draw
仅使用 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;
    

14
投票
您可以尝试 GraphUtil 中内置的 Delphi ScaleImage


4
投票
我使用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);

您可以通过改变插值模式来选择质量VS速度因子

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。


© www.soinside.com 2019 - 2024. All rights reserved.