是否依赖于uchar []平台创建的QImage的endian-ness?

时间:2012-10-19 12:20:23

标签: qt endianness qimage

QImage有一个构造函数QImage(uchar * data,int width,int height,int bytesPerLine,Format format),它从现有的内存缓冲区创建一个QImage。

字节顺序(uchars)是否依赖于平台?如果我将alpha,red,green和blue的值添加到其中,则使用蓝色交换alpha,使用绿色交换红色。这表明有一个字符串问题。

我现在想知道字节序是否依赖于平台。 Qt文档没有说明这一点。

如果它不依赖于平台,我只会更改存储值的顺序:

texture[ startIndex + 0 ] = pixelColor.blue();
texture[ startIndex + 1 ] = pixelColor.green();
texture[ startIndex + 2 ] = pixelColor.red();
texture[ startIndex + 3 ] = pixelColor.alpha();

如果 依赖于平台,我会创建一个uint32数组,存储值计算为alpha<< 24 |红色<< 16 |绿色<< 8 |蓝色,并在将数组传递给QImage()构造函数之前重新解释它。

致以最诚挚的问候,

2 个答案:

答案 0 :(得分:1)

这取决于格式。表示像素中总位数的格式依赖于字节序。像Format_ARGB32表示一个32位整数,其最高8位是alpha,在小端机器上,相同的8位是字节序列中的最后一个字节。

Format_RGB888这样的序列中具有单个位的格式不依赖于字节序。 Format_RGB888表示字节以R,G,B顺序排列在内存中,与端点无关。

要访问缓冲区中的字节,我会使用Q_BYTE_ORDER宏来有条件地编译相应的字节访问代码,而不是使用shift。

我个人使用Format_RGB888,因为我没有直接在图像中处理alpha。这节省了处理endian差异的问题。

答案 1 :(得分:0)

来自Qt Docs

  

警告:如果您正在访问32-bpp图像数据,请转换返回的图像数据   指向QRgb *(QRgb具有32位大小)并使用它来读/写   像素值。你不能直接使用uchar *指针,因为   像素格式取决于底层平台上的字节顺序。使用   qRed(),qGreen(),qBlue()和qAlpha()来访问像素。