将RGBA C数组转换为ARGB C数组



我正在尝试生成ARGB格式的图像。我可以使用GIMP获取BMP/JPG/PNG并输出RGBA8888 C源文件。这个项目是在一个微控制器/嵌入式系统(32位,1MB闪存,512kB SRAM)。内部LCD外设使用ARGB格式,所以我不能改变它读取数组的方式。

所以我想做的是将GIMP (RGBA8888格式)的输出转换为ARGB8888格式。基本上,取最后一个字节并将其交换到前面。理想情况下,我会在我的计算机上进行这种转换,而不是在嵌入式系统上。我只是想到一个简单的方法。

我已经尝试了几个在线转换器,但它们都输出RGBA格式。

我在C, c++, Java和Python编程很舒服,只是需要帮助想出转换的算法。即使有人能用伪代码表达出来也会很有帮助。请不要只说:

  1. 将数组中的第一个字节复制到var A
  2. 将数组中的第四个字节复制到var B
  3. 复制变量B到数组的第一个字节
  4. 复制变量A到数组的第四个字节
  5. 继续对每组四个字节的数组(数组为300kB)

1到4很容易,但是处理每个4字节组却难倒了我。有没有一种简单的方法可以做到这一点,而不需要看起来像意大利面条代码那样令人费解的解决方案?转换可以在Windows .bat脚本或Linux bash脚本中完成吗?

我将图像加载到GIMP中并导出C数组。在单片机中,阵列存储在闪存中。然后加载到SRAM中的帧缓冲区中,其中LCD外设将数据发送到显示器。图像显示,但由于字节顺序的原因,颜色是错误的。

两个数组的格式为:const uint8_t displayImage[307200];//在flash中uint8_t frameBuffer [307200];//在SRAM

您列出C作为您的编程语言,因此这里有一个小的C11程序将原始RGBA文件转换为原始ARGB文件。

#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>

FILE * infile = NULL;
FILE * outfile = NULL;

_Noreturn void quit( int exitcode, const char * message, ... )
{
va_list args;
va_start( args, message );
vfprintf( exitcode ? stderr : stdout, message, args );
va_end( args );

if (infile)  fclose( infile );
if (outfile) fclose( outfile );

exit( exitcode );
}

int main( int argc, char ** argv )
{
if (argc != 3) 
quit( 1, "usage:n  %s RGBAFILE ARGBFILEn", argv[0] );

if ((infile = fopen( argv[1], "rb" )) == NULL)
quit( 1, "Failure to open "%s"n", argv[1] );

if ((outfile = fopen( argv[2], "wb" )) == NULL)
quit( 1, "Failure to create "%s"n", argv[2] );

unsigned char bytes[5];                 // ARGBA
while (fread( bytes+1, 4, 1, infile ))  // read .RGBA
{
bytes[0] = bytes[4];                  // .RGBA --> ARGBA
if (!fwrite( bytes, 4, 1, outfile ))  // write ARGB.
quit( 1, "%sn", "Failure to write to output file!" );
}
if (ferror( infile ))
quit( 1, "%sn", "Failure to read from input file!" );

quit( 0, "%sn", "done" );
}

Windowscl.exe /EHsc /W4 /Ox /std:c11 /D_CRT_SECURE_NO_WARNINGS a.c测试
Linuxclang -Wall -Wextra -pedantic-errors -O3 -std=c11 a.c测试

最新更新