【问题标题】:Is the endian-ness of a QImage created from a uchar[] platform-dependent?QImage 的字节序是从 uchar[] 平台创建的吗?
【发布时间】:2012-10-20 01:05:33
【问题描述】:

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

最好的问候,

詹斯

【问题讨论】:

    标签: qt endianness qimage


    【解决方案1】:

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

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

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

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

    【讨论】:

    • “像 Format_RGB888 这样的序列中具有单个位的格式不依赖于字节序。”似乎Format_RGB666 仍然依赖于字节序。可以肯定地说,如果描述包括“字节顺序”或“半字顺序”,则通道实际上使用内存中的规定顺序流动,否则它们形成一个完整的单词(因此向后流动典型的 x86 字节序 CPU)。 Format_RGB888 明确表示“字节排序”,而 BGR888 没有 ??‍♀️。
    【解决方案2】:

    来自Qt Docs

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

    【讨论】:

    • 谢谢。我本来希望在 QImage::Format 的枚举值的文档中出现这样的警告,而不是函数 QImage::scanLine ...
    猜你喜欢
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2010-09-24
    • 2016-01-19
    相关资源
    最近更新 更多