【问题标题】:Stretching a Bitmap in Delphi using StretchDraw method使用 StretchDraw 方法在 Delphi 中拉伸位图
【发布时间】:2014-05-30 07:34:24
【问题描述】:

我有一个尺寸的位图图像(宽度 = 250,高度 = 200)。我用下面的代码 sn-p 拉伸它,但质量下降了。有没有办法在拉伸时保留位图图像的质量?

with Bitmap do
begin
  Width := 200;
  Height := 150;
  PixelFormat := pf1bit;    
  TransparentMode := tmAuto;
  Canvas.CopyMode := cmSrcCopy;
  Canvas.FillRect(Rect(0, 0, Width, Height));
  Canvas.StretchDraw(Rect(0, 0, Width, Height), MyBitMap);
end; 

这里,MyBitMapTBitMap 类型,我在其中加载了原始位图图像。

而且,这是正确的做法吗?

【问题讨论】:

  • 这里没有可以应用的魔法。您不能指望计算机从稀薄的空气中合成像素,从而保持人脑感知的质量。有算法可以重新采样。哪一个表现最好将取决于图像的类型。我相信 WIC 有各种各样的重采样器。另一个不错的选择是 graphics32。
  • 添加到@DavidHeffernan 的评论中,调整大小时保持“图像”质量的唯一方法是使用矢量图形...
  • 想象一下你在一个小样本上做了什么。有一个 3x3 像素大小的白色光栅图像,在周围画一个 1 像素宽的黑色边框并想象调整它的大小,例如到 2x2 像素。调整大小会提高质量吗?
  • 尝试添加行“SetStretchBltMode(Canvas.Handle, HALFTONE);”在调用 Canvas.StretchDraw 之前。然后应该使用线性插值进行拉伸,结果应该看起来更好。
  • 另请注意,您已将图像从 250x200(1.25 纵横比)更改为 200x150(1.33 纵横比)。尽管已经讨论过分辨率损失和混叠,但这本身就会扭曲图像。如果要缩放图像并保留纵横比,则必须将两个维度乘以相同的缩放因子 - 加法不起作用。这就是为什么小学数学如此重要的原因。缩放到 200 像素宽的正确垂直尺寸是 160 像素高。

标签: delphi canvas bitmap delphi-xe4


【解决方案1】:

Here 是一个非常好的过程,称为 SmoothResize(abmp:TBitmap; NuWidth,NuHeight:integer);。它能够很好地调整 TBitmap 宽度的大小。 不要忘记添加两个类型声明。

StretchDraw 方法非常快并且是画布的一部分。质量和你描述的一样,不是很出色。如果要使用 StretchDraw,请将 PixelFormat 更改为 pf24bit 并删除 FillRect-line。

希望这会有所帮助:)

【讨论】:

  • 如果原始问题消失了,您认为将本程序的文本转移到此处以便获得副本在道德上是好的?
  • @Paul 非常肯定,只要你感谢格里菲斯大学的“Charles Hacker”
【解决方案2】:

这可能是因为您有 PixelFormat := pf1bit;

至少设置 pf8bit 或更好的 pf24bit 以获得更好的结果,因为您不关心文件大小

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    相关资源
    最近更新 更多