如何在C中按组反转数组

时间:2019-09-01 09:43:54

标签: c arrays

我正在尝试为一个旧设备制作软件驱动程序,并成功为其添加了位图支持。问题在于所有位图都是垂直翻转的,我需要以某种方式翻转它们。

我的数组有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

1 个答案:

答案 0 :(得分:0)

有几种选择。例如,其中只有两个:

  • 请使用2-D字节数组,而不是一维字节数组,在“外部”维中使用Y,在“内部”维中使用(X *颜色)。使用memcpy()复制整个像素行而不更改其字节顺序。

  • 为像素和行定义struct,并将位图定义为一维行数组。您可以通过简单的分配复制struct值(一行),然后将其编译到幕后的memcpy()中。

初学者的方法也可以是使用两个嵌套循环,一个用于Y,另一个用于(X *颜色)。 Y循环将翻转位图,而X循环将保留序列。

我会选择struct,因为它更具可读性并实现了您的意思。而且,您不想处理字节,想要处理像素和行。