抗锯齿图像旋转






4.57/5 (14投票s)
2005 年 11 月 11 日
2分钟阅读

106898

4082
使用几何方法实现完美的图像旋转。
引言
(作者:Mark Gordon) Aarot (抗锯齿图像旋转算法) 可以将图像旋转任意角度。与大多数图像旋转算法不同,Aarot 使用几何方法来确定每个像素应具有多少表示。它通过将源位图以一定角度重叠到目标位图上,并计算每个源像素与每个目标像素的重叠面积来实现这一点。利用这个值,Aarot 可以权衡每个源像素在每个目标像素中应代表多少,从而创建最佳的旋转效果。
下图演示了 Aarot 的工作原理。左侧是未旋转的源图像。中间,旋转后的源图像以 40 度角叠加在目标图像上。然后 Aarot 找到每个源像素在每个目标像素中的重叠面积。它使用这些值来权衡每个源像素的颜色信息属于每个目标像素的程度。
不幸的是,高质量需要付出代价。在我的电脑上 (1.81 GHz, AMD Athlon 64 处理器),旋转 1152 x 864 图像 61 度需要将近 15 秒。
实现
HBITMAP aarot::rotate(HBITMAP src, double rotation, aar_callback callbackfunc, int bgcolor, bool autoblend)
Src
:要旋转的Bitmap
的句柄。Rotation
:图像应逆时针旋转的度数。callbackfunc
:指向回调函数的指针。该函数将收到有关旋转完成百分比的通知,并提供停止旋转的机会。此参数可以为NULL
。有关更多信息,请参阅 *使用回调函数*。BgColor
:旋转位图未与目标位图重叠的背景颜色。AutoBlend
:决定旋转图像的边缘是否应与由BgColor
定义的背景颜色混合。如果为false
,则每个像素的rgbReserved
字节将设置为适当的 alpha 值,以便以后可以将旋转图像混合到另一张图像上,而不会出现明显的边缘。Return
:指向旋转后的Bitmap
对象的句柄。如果出现错误或回调函数指示退出,则返回NULL
。
使用回调函数
回调函数应具有以下签名
bool AarotCallbackFunc(double percentdone) { ... }
传递给回调函数的 double
是一个介于 0 到 1 之间的数字,表示主算法距离完成的程度。(0 = 0%,.5 = 50%,1 = 100%)如果回调函数返回 true
,则主算法将退出并返回 NULL
位图。这样,用户就有机会停止旋转。