6

谁能澄清工作站 Win32 API 的 GDI StretchBlt函数是否执行双线性插值以缩放 24/32位彩色图像的较大和较小图像如果没有,是否有执行此操作的 GDI(不是GDI+)函数?

SetStretchBltMode fn 有一个设置HALFTONE ,记录如下:

HALFTONE 将源矩形中的像素映射到目标矩形中的像素块。目标像素块上的平均颜色近似于源像素的颜色。

我已经看到参考资料(请参阅第一个答案的后续内容),这在缩小图像时执行双线性插值,但没有明确回答放大时会发生什么。

我注意到Windows Mobile CE SDK 确实支持 BILINEAR 标志- 这与 HALFTONE 注释完全相反(仅适用于放大)。

请注意,对于这个问题的范围,我对追求 GDI+(它有许多插值选项)、OpenGL、DirectX 等作为替代品不感兴趣,所以请不要为这些其他 API 或替代品的后续行动而烦恼图像库。

我真正希望找到的是一些明确的 MS/MSDN 或其他高质量文档,这些文档清楚地记录了 Win32(桌面)GDI 行为的这种行为。

同时,我将尝试一些比较 GDI 与 Direct2D 的实验(它确实有一个明确的标志来控制这一点)并发布我的发现。

谢谢!

4

2 回答 2

8

在过去的几周里,我一直在研究同样的问题。

据我所知,微软没有任何关于这种行为的权威文档。

但是,我自己进行了一些测试,以尝试确定 StretchBlt 在半色调模式下的放大和缩小图像方面可以信任的程度。

我的发现是:

1) StretchBlt 确实可以产生足够质量的放大和缩小图像。它可能略低于 Photoshop 的质量,但对于大多数实际用途来说可能还可以。

2)它似乎取决于硬件加速,只要它可用。我无法确认这一点,但我有点担心这可能会导致不同类型硬件上的输出不同。但是,在我尝试过的 5 或 6 个不同的系统上,无论新旧,性能始终如一且快速。

3) If you use the call on a 16-bit color device, or lower, StretchBlt will automatically dither your image. If you run it on a 24-bit color device, it will not dither.

4) If you use it to scale small images (smaller than 150x150px), it will randomly fall back to nearest neighbour interpolation. This can be remedied in your own software, by padding the bitmap before scaling, doing StretchBlt on it, and then removing the padding afterwards. Kind of a hack, but it works.

于 2010-12-05T12:34:30.003 回答
0

HALFTONE 模式基于在定义的正方形上改变转换阈值,在图像上执行非常块状的半色调抖动。我从未见过将其视为最佳选择的情况。

COLORONCOLOR 是彩色图像的最佳模式,但正如您所见,它不会产生很好的效果。

GDI 不支持双线性模式(您发现的 Windows Mobile CE 除外)。双线性的简单实现在缩小图像时效果不佳,因为它只是尝试在两个相邻输入像素之间进行插值,而不尝试从更大的区域进行绘制。

于 2010-11-23T06:07:04.553 回答