16

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

丑陋的方式
(来源:xrw.bc.ca

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

更好的方式
(来源:xrw.bc.ca

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

4

4 回答 4

32

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

于 2009-12-29T18:39:09.070 回答
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;
于 2009-12-29T19:33:10.130 回答
12

您可以尝试 GraphUtil 的内置 Delphi ScaleImage

于 2009-12-30T08:11:33.410 回答
3

我使用 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;

和smoting模式:

SmoothingModeDefault     = QualityModeDefault;
SmoothingModeHighSpeed   = QualityModeLow;
SmoothingModeHighQuality = QualityModeHigh;
SmoothingModeNone        = 3;
SmoothingModeAntiAlias   = 4;

注意:这需要 XP 或更高版本,或者在您的安装程序中捆绑 gdiplus.dll。

于 2010-01-01T10:22:15.430 回答