是否可以在 Delphi 中平滑缩放的 TBitmap?

Posted

技术标签:

【中文标题】是否可以在 Delphi 中平滑缩放的 TBitmap?【英文标题】:Is it possible to smooth a scaled TBitmap in Delphi? 【发布时间】:2010-05-07 11:11:39 【问题描述】:

我在具有 256x256 位图的 TImage 上使用 Stretched=True。这将按比例缩小 1、2、4 或 8。正如预期的那样,位图上的文本越远离“1”,就越可怕。 我注意到,尽管 Windows 7 资源管理器将位图的缩小版本呈现“更柔和”且更令人愉悦。是否有可能以这种方式“模糊”一个 TBitmap?

【问题讨论】:

【参考方案1】:

我想你的意思是 TImage 上的 Stretched = True,而不是 A TBitmap。

不幸的是,在调整图像大小时,TImage 没有内置重采样器。 我的建议是使用Graphics32,因为它支持多种重采样器(有些更适合增加尺寸,另一些更适合减小尺寸)

【讨论】:

【参考方案2】:

通过使用 HALFTONE StretchBltMode,您将获得比普通拉伸绘制更平滑的结果。 这仅适用于 windows 2000 及更高版本

procedure SmoothResize();
var pt:TPoint;
    h: HDC;
begin
  h := imgMainPicture.Canvas.Handle;
  // Previous call to StretchDraw
  // imgMainPicture.Canvas.StretchDraw(Rect(0, 0, imgMainPicture.Width - 1,
  // imgMainPicture.Height - 1), curPicture.AnnotatedBitmap);
  // Normal StretchDraw uses STRETCH_DELETESCANS as StretchBltMode , HALFTONE should give better results
  GetBrushOrgEx(h, pt);
  SetStretchBltMode(h, HALFTONE);
  SetBrushOrgEx(h, pt.x, pt.y, @pt);
  StretchBlt(h, 0, 0, imgMainPicture.Width - 1,
    imgMainPicture.Height - 1, curPicture.AnnotatedBitmap.Canvas.Handle,
    0, 0, curPicture.Width,curPicture.Height,SRCCOPY);
end;

【讨论】:

@BrianFrost HALFTONE 或 STRETCH_HALFTONE 是您最好的选择恕我直言,这里有一些代码 code.google.com/p/delphigeist-delphi-stuff/source/browse/trunk/…

以上是关于是否可以在 Delphi 中平滑缩放的 TBitmap?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中平滑放大和缩小 UIButton

在 OpenGL 中平滑面部边缘的技术

使用 Swift 在 iOS 中平滑搜索栏动画

H5页面在ios中平滑滚动

ZBrush中平滑笔刷介绍

如何在 CamShift 中平滑跟踪