imageAnt除了能制作特效文字和添加图片水印等功能外,本身是一个图片浏览器,类似于XP中的图片浏览器,所不同的是imageAnt能支持图片自由旋转。图片放大缩小以及旋转的算法都简单。但缩放和旋转合在一起就不那么简单了。
开始的时候,我做这个功能是简单的把图片放大然后旋转。图片小效果还不错,但图片大了速度就奇慢,处理时间呈指数级上升。特别是图片放大后再做旋转,那更不得了。imageAnt支持16倍放大,也就是说一张1024×768的图片可以放大到16384×12288。在16384×12288大小的图片做任何处理都需要相当的时间。更不用提旋转了。
所以简简单单的放大后再旋转肯定不行。而软件本身不能放弃旋转的功能,而且要让使用者体验平滑自由旋转
最好的办法就是只处理显示的那部分功能。也就是说,只计算出需要显示的那部分的旋转和缩放。
但实现平滑自由旋转,这样还不够。因为缩放本身需要一定的时间,而旋转也需要一定的时间。
根据使用行为可以看到,当用户旋转的时候,图片并不会进行缩放操作。而当图片有一定角度的时候进行缩放操作通常通过按钮或滚轮操作处理时间要求上会小点。保存图片缩放后的内容是比较好的方法。
这里还有一点必须要提到的是,图片缩放和图片旋转是有损过程。所以每副显示的图片都必须从原图计算。这样能最大限度的减少图片的失真。由此,imageAnt的图片缩放和旋转就变得异常复杂。
我做了两个类分别是
- CRotator保持图片旋转后计算得到的图片,当界面需要更新的时候,直接从这里获取数据。
- CZoomer保持图片缩放后计算得到的图片,当用户进行旋转操作的时候数据从这里获得。
需要指出的是,这两个类里面保持的内容都不是完整的图片内容。
CRotater里面保存的是显示界面时需要的图片内容。
而CZoomer里面的内容更加复杂。这时因为Zoomer中的内容和Rotater中的内容无法简简单单的用Rect进行映射。
为此,缩放后的图片被分割成很多64×64大小的子图片。每次计算的时候以子图为计算单位获得数据。
这需要复杂的计算。但最终效果还是不错的。imageAnt实现了自由平滑旋转