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

发布于 2024-08-31 15:37:41 字数 164 浏览 7 评论 0原文

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

I am using Stretched=True on a TImage with a 256x256 bitmap. This gets scaled down by 1,2,4 or 8. As expected, text on the bitmap gets more horrible the more I depart from '1'.
I notice though that Windows 7 explorer renders a scaled down version of the bitmap 'softer' and more pleasing. Is it possible to 'blur' a TBitmap in this way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

谜泪 2024-09-07 15:37:41

通过使用 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;

By using the HALFTONE StretchBltMode, you will get smoother results than the normal stretchdraw.
This will only work in windows 2000 and later

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;
迎风吟唱 2024-09-07 15:37:41

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

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

I suppose you mean Stretched = True on a TImage, not on A TBitmap.

Unfortunately TImage has no resamplers built in, when it comes to resizing images in it.
My recommendation would be to use Graphics32 as it supports a variety of resamplers (some are better for increasing size others for reducing size)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文