我正在尝试为一个旧设备制作软件驱动程序,并成功为其添加了位图支持。问题在于所有位图都是垂直翻转的,我需要以某种方式翻转它们。
我的数组有230400个元素(对于320x240的分辨率,因为320 * 3的颜色是每1个y像素960个元素,因此总计230400个)
昨天我从Reversing arrays in C开始尝试了这个,但是今天我意识到我需要从头到尾切换每960个元素,以使其垂直翻转。
我还在互联网上尝试了一个数组反向向导,但是它反转了所有元素,因此颜色发生了变化,并且在成功垂直翻转后水平翻转了
我使用https://stackoverflow.com/a/9296467导入320x240位图 ,将数据重命名为BMPdata并将我的代码添加到B,G,R到R,G,B代码
data[(i+y*320)] = BMPdata[i];
data[(i+y*320)+1] = BMPdata[i+1];
data[(i+y*320)+2] = BMPdata[i+2];
这段代码将红色(第一行),绿色(第二行),蓝色(第三行)中的每个像素设置为BMPdata数组中所需的值。
所以我希望它能够垂直翻转,因为之前使用的那个不能正常工作,而第二个将整个数组从0-230400反转为230400-0的颜色也改变了(这对我来说是合乎逻辑的)但是也翻转了图像水平,所以我也不能使用它。
我希望它使每960个元素从头到尾切换而不改变其中的任何内容,因此在示例中: 我有5760个元素的数组
960-1920: Test of the second line.
1920-2880: Third test
2880-3840: 4th line of text
3840-4800: Nearly the last thing.
4800-5760: Last line.
我希望它会像这样翻转:
0-960: Last line.
960-1920: Nearly the last thing.
1920-2880: 4th line of text
2880-3840: Third test
3840-4800: Test of the second line.
4800-5760: This is a test of the first line.
但是它看起来像是通过反向数组翻转了:
0-960: .enil tsaL
960-1920: .gniht tsal eht ylraeN
1920-2880: txet fo enil ht4
2880-3840: tset drihT
3840-4800: .enil dnoces eht fo tseT
4800-5760: .enil tsrif eht fo tset a si sihT
答案 0 :(得分:0)
有几种选择。例如,其中只有两个:
请使用2-D字节数组,而不是一维字节数组,在“外部”维中使用Y,在“内部”维中使用(X *颜色)。使用memcpy()
复制整个像素行而不更改其字节顺序。
为像素和行定义struct
,并将位图定义为一维行数组。您可以通过简单的分配复制struct
值(一行),然后将其编译到幕后的memcpy()
中。
初学者的方法也可以是使用两个嵌套循环,一个用于Y,另一个用于(X *颜色)。 Y循环将翻转位图,而X循环将保留序列。
我会选择struct
,因为它更具可读性并实现了您的意思。而且,您不想处理字节,想要处理像素和行。