Bitmap类里的方法RotateFlip能把位图进行翻转或旋转,对其实现方式很好奇。下面就是实现的功能:
1. 计算目标图像每像素的位置所用的接口
2.计算目标图像每像素的位置所用的抽象类(其实接口可以省略)
3.旋转180° 所用到的计算
4.旋转180°再垂直翻转
5.旋转180°
6.旋转90°
7.旋转90°再水平翻转
8.旋转90°再垂直翻转
9.不进行旋转和翻转
10. 垂直翻转
11. 静态旋转翻转类
12.测试方法
用上述这些类把旋转翻转的组合方式都是先完成,现只支持8位以上位图。经过测试,速度不用说了。
以上所用到的类及其方法开始只在一个大方法里,经过一步一步重构,最后改头换面,变成如今这样了。
实现历程:开始想到的是用GetPixel取RGB颜色在用SetPixel放到对应的位置去,发现这种方法实在是很慢。自己感觉一定是自己想错了,微软绝对不是这么做的,要不系统带的工具旋转翻转图片怎么那么快呢。应该,绝对有其他方法。根据位图的文件存储格式,想象一下,要是把对应的字节位置一换,就实现了。但是我不能每次都读文件写文件啊,IO操作也很耗时的。这怎么办,要是得到位图在内存中的数据结构就好了,咦,偏巧Bitmap就有这个方法获得对应的数据,他就是LockBits方法。有了这个方法之后,关键就需要算法了。