StretchBlt HALFTONE == BILINEAR用于所有缩放?

hol*_*olt 5 windows gdi raster image-processing

任何人都可以阐明如果GDI StretchBlt为工作站Win32 API函数执行用于缩放到双线性插值二者较大和较小的图像24位/ 32位彩色图像?如果没有,是否有一个GDI(而不是 GDI +)功能呢?

SetStretchBltMode FN具有设置HALFTONE其如下记载:

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

我已经看过参考文献(参见第一个答案的后续内容),这会在缩小图像时执行双线性插值,但是在放大时没有明确的答案.

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

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

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

同时,我会尝试一些比较GDI和Direct2D的实验(它确实有一个明确的标志来控制它)并发布我的发现.

谢谢!

bja*_*d_e 6

在过去的几周里,我一直在研究这个问题.

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

但是,我自己进行了一些测试,试图确定StretchBlt可以信任的程度,以便在半色调模式下向上和向下缩放图像.

我的发现是:

1)StretchBlt确实产生足够质量的上下缩放图像.它可能是低于Photoshop质量的触摸,但对于大多数实际用途可能是好的.

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

3)如果您在16位彩色设备或更低的设备上使用呼叫,StretchBlt将自动抖动您的图像.如果在24位彩色设备上运行它,它将不会抖动.

4)如果用它来缩放小图像(小于150x150px),它将随机回落到最近邻插值.这可以在您自己的软件中进行补救,方法是在缩放之前填充位图,对其执行StretchBlt,然后删除填充.一种黑客,但它的工作原理.


Mar*_*som 0

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

COLORONCOLOR 是彩色图像的最佳模式,但正如您所见,它并没有给出很好的结果。

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

  • 在我的例子中,源和目标都是 24 位颜色,图像是灰度图像。在我使用 HALFTONE 放大此类图像区域的实验中,结果似乎是双线性插值(因为同一图像上的 COLORONCOLOR 显然是最近邻)并且没有抖动的迹象。也就是说,我不想依赖未记录的行为,所以如果我不能指望这种行为保持一致,我会找到另一个解决方案。 (2认同)