任何人都可以澄清工作站Win32 API的GDI StretchBlt函数是否执行双线性插值以缩放为两个 24/32位彩色图像的较大和较小图像?如果没有,是否有GDI( not GDI +)功能可以做到这一点?
SetStretchBltMode fn的设置为 HALFTONE ,其记录如下:
HALFTONE 将源矩形中的像素映射到目标矩形中的像素块。目标像素块上的平均颜色近似于源像素的颜色。
我看到references (see follow-up to first answer)在缩小图像时执行双线性插值,但没有明确回答缩放时会发生什么。
我注意到Windows Mobile CE SDK does support a BILINEAR flag - 与HALFTONE注释完全相反(仅适用于扩展)。
请注意,对于这个问题的范围,我对追求GDI +(有多种插值选项),OpenGL,DirectX等作为替代方案不感兴趣,所以请不要打扰关于这些其他的后续行动API或备用图像库。
我真正希望找到的是一些明确的MS / MSDN或其他高质量文档,它们清楚地记录了Win32(桌面)GDI行为的这种行为。
与此同时,我会尝试一些比较GDI和Direct2D的实验(它确实有一个明确的标志来控制它)并发布我的发现。
谢谢!
答案 0 :(得分:6)
过去几周我一直在研究这个问题。
据我所知,Microsoft没有关于此行为的任何权威文档。
但是,我自己进行了一些测试,尝试确定StretchBlt可以信任的程度,以便在半色调模式下对上下缩放图像执行一致。
我的发现是:
1)StretchBlt确实可以产生足够质量的上下缩放图像。它可能是低于Photoshop质量的触摸,但对于大多数实际用途可能没问题。
2)它似乎取决于硬件加速,只要它可用。我无法证实这一点,但我有点担心这会导致不同类型硬件上的输出不同。然而,在5或6个不同的系统上,无论是新旧系统,性能都是一致且快速的。
3)如果您在16位彩色设备或更低的设备上使用该呼叫,StretchBlt将自动抖动您的图像。如果在24位彩色设备上运行它,它将不会抖动。
4)如果你用它来缩放小图像(小于150x150px),它会随机回落到最近邻插值。这可以在您自己的软件中进行补救,方法是在缩放之前填充位图,对其执行StretchBlt,然后删除填充。有点黑客,但它确实有效。
答案 1 :(得分:0)
HALFTONE模式基于在定义的方格上改变转换阈值,在图像上执行非常块状的半色调抖动。我从未见过一个被认为是最佳选择的情况。
COLORONCOLOR是彩色图像的最佳模式,但正如您所见,它不会产生很好的效果。
GDI不支持双线性模式(除了您发现的Windows Mobile CE之外)。缩小图像时,双线性的天真实现并不是很好,因为它只是试图在两个相邻的输入像素之间进行插值,而不是试图从更大的区域进行绘制。