【发布时间】: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;
这里,MyBitMap 是 TBitMap 类型,我在其中加载了原始位图图像。
而且,这是正确的做法吗?
【问题讨论】:
-
这里没有可以应用的魔法。您不能指望计算机从稀薄的空气中合成像素,从而保持人脑感知的质量。有算法可以重新采样。哪一个表现最好将取决于图像的类型。我相信 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