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的实验(它确实有一个明确的标志来控制它)并发布我的发现.
谢谢!
在过去的几周里,我一直在研究这个问题.
据我所知,微软没有关于此行为的任何权威文档.
但是,我自己进行了一些测试,试图确定StretchBlt可以信任的程度,以便在半色调模式下向上和向下缩放图像.
我的发现是:
1)StretchBlt确实产生足够质量的上下缩放图像.它可能是低于Photoshop质量的触摸,但对于大多数实际用途可能是好的.
2)它似乎取决于硬件加速,只要它可用.我无法证实这一点,但我有点担心这会导致不同类型硬件上的输出不同.然而,在我尝试过的5或6个不同的系统上,无论新旧,性能都是一致且快速的.
3)如果您在16位彩色设备或更低的设备上使用呼叫,StretchBlt将自动抖动您的图像.如果在24位彩色设备上运行它,它将不会抖动.
4)如果用它来缩放小图像(小于150x150px),它将随机回落到最近邻插值.这可以在您自己的软件中进行补救,方法是在缩放之前填充位图,对其执行StretchBlt,然后删除填充.一种黑客,但它的工作原理.
HALFTONE 模式基于在定义的正方形上改变转换阈值,在图像上执行非常块状的半色调抖动。我从未见过它被认为是最佳选择的情况。
COLORONCOLOR 是彩色图像的最佳模式,但正如您所见,它并没有给出很好的结果。
GDI 不支持双线性模式(除了您发现的 Windows Mobile CE 中的情况)。双线性的简单实现在缩小图像时表现不佳,因为它只是尝试在两个相邻输入像素之间进行插值,而不尝试从更大的区域进行绘制。