我正在研究一个项目,我需要根据图像的行和列来计算某些东西。获取图像行的位很容易。但是,为了获取每列的位,我需要转置图像,使列成为行。
我正在使用BMP图片作为输入。 BMP图片中有多少行X列?我想在可能的情况下看到伪代码或其他东西。
答案 0 :(得分:2)
听起来你想要执行一个与旋转有点不同的矩阵转置。在旋转中,行可以成为列,但是行或列将根据旋转方向以相反的顺序。换位维护行和列的原始顺序。
我认为使用正确的算法比使用汇编或只是C更重要。旋转90度或换位真的归结为移动记忆。如果你使用像这样的天真算法,最重要的是缓存未命中的影响:
for(int x=0; x<width; x++)
{
for(y=0; y<height; y++)
out[x][y] = in[y][x];
}
这会导致很多缓存未命中,因为你在内存中跳了很多次。使用基于块的方法更有效。 Google用于“缓存高效矩阵转置”。
您可以获得一些收益的一个地方是使用SSE指令一次移动多个数据。这些可在汇编和C中使用。另请查看this link。大约一半时间他们有一个关于计算快速矩阵转置的部分。
修改强> 我刚刚看到你的评论说你正在为集会中的一个班级做这个,所以你可能会忽略我所说的大部分内容。我认为你在使用装配时想要挤出最佳性能。
答案 1 :(得分:1)
它有所不同。 BMP可以具有任何大小(最大限制),它们也可以采用不同的格式(32位RBG,24位RBG,16位调色板,8位调色板,1位单色),依此类推
与大多数其他问题一样,最好先用您选择的高级语言编写解决方案,然后根据需要将部分或全部转换为ASM。
但是,对于这项任务的最简单形式,即32位RGB格式,以90度的多倍旋转将像旋转二维阵列一样。