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()构造函数之前重新解释它。
致以最诚挚的问候,
延
答案 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()来访问像素。