3

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() 构造函数之前 reinterpret_cast 数组。

此致,

延斯

4

2 回答 2

2

这取决于格式。表示像素中总位数的格式是字节序相关的。LikeFormat_ARGB32表示一个 32 位整数,其最高 8 位为 alpha,在 little endian 机器上,相同的 8 位是字节序列中的最后一个字节。

序列中具有单个位的格式Format_RGB888不依赖于字节序。Format_RGB888表示字节按 R、G、B 顺序排列在内存中,而不考虑字节序。

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

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

于 2012-10-19T17:05:33.043 回答
0

来自Qt 文档

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

于 2012-10-19T14:07:50.470 回答