imageAnt中的图片放大缩小以及旋转的优化
2009-01-01 00:05
239 查看
点击这里下载imageAnt
imageAnt除了能制作特效文字和添加图片水印等功能外,本身是一个图片浏览器,类似于XP中的图片浏览器,所不同的是imageAnt能支持图片自由旋转。图片放大缩小以及旋转的算法都简单。但缩放和旋转合在一起就不那么简单了。
开始的时候,我做这个功能是简单的把图片放大然后旋转。图片小效果还不错,但图片大了速度就奇慢,处理时间呈指数级上升。特别是图片放大后再做旋转,那更不得了。imageAnt支持16倍放大,也就是说一张1024×768的图片可以放大到16384×12288。在16384×12288大小的图片做任何处理都需要相当的时间。更不用提旋转了。
所以简简单单的放大后再旋转肯定不行。而软件本身不能放弃旋转的功能,而且要让使用者体验平滑自由旋转
最好的办法就是只处理显示的那部分功能。也就是说,只计算出需要显示的那部分的旋转和缩放。
但实现平滑自由旋转,这样还不够。因为缩放本身需要一定的时间,而旋转也需要一定的时间。
根据使用行为可以看到,当用户旋转的时候,图片并不会进行缩放操作。而当图片有一定角度的时候进行缩放操作通常通过按钮或滚轮操作处理时间要求上会小点。保存图片缩放后的内容是比较好的方法。
这里还有一点必须要提到的是,图片缩放和图片旋转是有损过程。所以每副显示的图片都必须从原图计算。这样能最大限度的减少图片的失真。由此,imageAnt的图片缩放和旋转就变得异常复杂。
我做了两个类分别是
CRotator保持图片旋转后计算得到的图片,当界面需要更新的时候,直接从这里获取数据。
CZoomer保持图片缩放后计算得到的图片,当用户进行旋转操作的时候数据从这里获得。
需要指出的是,这两个类里面保持的内容都不是完整的图片内容。
CRotater里面保存的是显示界面时需要的图片内容。
而CZoomer里面的内容更加复杂。这时因为Zoomer中的内容和Rotater中的内容无法简简单单的用Rect进行映射。
为此,缩放后的图片被分割成很多64×64大小的子图片。每次计算的时候以子图为计算单位获得数据。
这需要复杂的计算。但最终效果还是不错的。imageAnt实现了自由平滑旋转
相关文章推荐
- Andriod SeekBar以及实现图片旋转平移放大缩小
- iOS 图片查看关闭,以及放大缩小旋转移动
- Qt+OpenGL实现正方体旋转平移放大缩小,以及六个面贴不同图片
- jQuery实现图片放大,缩小,翻转,旋转小实例
- vue实现裁切图片同时实现放大、缩小、旋转功能
- div内部实现图片旋转、放大、缩小、拖拽
- jquery实现图片放大,缩小,翻转,旋转小实例
- 仿澵浪微博图片放大缩小以及向左向右转(附DEMO)
- jquery图片查看插件,支持旋转、放大、缩小、拖拽、缩略图(仿qq图片查看)
- imageView图片放大缩小及旋转
- Winform 图片鼠标滚动查看(放大,缩小,旋转,拖动查看)[日常随笔]
- andriod 利用WebView实现 图片放大缩小以及移动[转]
- Android实现图片反转、翻转、旋转、放大和缩小
- 计算机学院研发第二轮考核-------利用WebSetting来浏览网页进行优化(js脚本加载,图片,可放大缩小等)
- bmp图片文件的操作 旋转、翻转、放大缩小
- 基于RxPaparazzo实现图片裁剪、图片旋转、比例放大缩小功能
- 高仿新浪点击图片放大(可以拖动,动态缩小放大,以及再次点击图片消失和保存图片的功能)
- jquery图片查看插件,支持旋转、放大、缩小、拖拽、缩略图(仿qq图片查看)
- JS控制图片拖动 放大 缩小 旋转 支持滚轮放大缩小 IE有效