65.9K
CodeProject 正在变化。 阅读更多。
Home

抗锯齿图像旋转

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.57/5 (14投票s)

2005 年 11 月 11 日

2分钟阅读

viewsIcon

106898

downloadIcon

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 位图。这样,用户就有机会停止旋转。

© . All rights reserved.