[讨论]给大家出一个算法方面的问题
简单的说,就是,图像的旋转问题,要求能做到90度的旋转,并且要求对内存的占用最小。更加精确的描述如下:1. 对原始图像IMAGE,其宽度分别为w和h,其图像数据存放在pdata所指向的缓冲区中,以一维的形式按行顺序存放,可以用一个三元组来描述这个图像 IMAGE(w, h, pdata);
2. 要求对IMAGE进行顺时针90度旋转的操作,并且使用最少的内存
这个问题提出的背景是,在一款数码产品上,可用内存只有20MB,当显示2000x2000x24bit的位图的时候,就会占用12MB左右的内存,如果使用常规的图片旋转算法,即另外创建一个同样大小但宽高相反的位图,然后计算旋转后的像素点到新的位图中。这样就会出现内存不足而无法旋转的问题。
传统的算法在理解和实现上都非常容易,但是要求申请与原位图同样大小的缓冲区,导致在空间上的开销太大。
大家不要小看这个问题,我仔细思考过,要在这个问题上节省空间真的很难。从理论上讲,这个问题是有解的,而且可以完全做到不申请任何额外的内存空间,即只对原始图像的pdata所指向的缓冲区进行操作,但是要写成通用性的代码的话,我现在都还没有想到一个好的算法。关键是要保证操作过程中图像数据不会因为被新的图像数据覆盖而丢失掉。并且还要保证旋转后的图像数据也是按行顺序存放。
想了半天,感觉如果不借助大量额外的缓冲区,这个问题似乎无解。
大家一起讨论下,帮忙想想办法。
我刚开始想到一个办法就是对矩阵做一次转置处理,然后再做一次水平翻转就可以了,但是这个算法只适用于宽高相等的位图。对于宽高不等的图像,要考虑更多的问题。