【问题标题】:How to reverse an array in groups in C如何在C中分组反转数组
【发布时间】:2020-01-04 18:42:17
【问题描述】:

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

我的数组有 230400 个元素(对于 320x240 分辨率,320*3 颜色是每 y 像素 960 个元素,所以总共 230400 个)

我昨天从Reversing arrays in C 尝试了这个,但今天我意识到我需要从头到尾切换每 960 个元素以(我认为)让它垂直翻转。

我也在互联网上尝试了一个数组反向指南,但它反转了所有元素,因此颜色发生了变化,并且在垂直翻转成功后水平翻转

为了导入 320x240 位图,我使用了https://stackoverflow.com/a/9296467 ,重命名数据做 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

【问题讨论】:

  • 为什么要翻转它们?例如,BMP 文件让原点位于左上角或左下角。读取数据时只需要知道顺序即可。

标签: c arrays


【解决方案1】:

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

  • 使用二维字节数组代替一维字节数组,Y 在“外部”维度,(X * 颜色)在“内部”维度。使用memcpy() 复制整个像素行而不更改其中的字节序列。

  • 为像素和行定义structs,并将位图定义为一维行数组。您可以通过简单的赋值复制struct 值(一行),该赋值将在后台编译成memcpy()

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 2022-01-25
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多