3

QImage には、既存のメモリ バッファから QImage を作成するコンストラクタ QImage (uchar *data, int width, int height, int bytesPerLine, Format format) があります。

バイト (uchars) の順序はプラットフォームに依存しますか? アルファ、赤、緑、青の値をインデックスの増加とともに入れると、アルファは青と交換され、赤は緑と交換されます。これは、エンディアンに問題があることを示しています。

エンディアンがプラットフォームに依存するかどうかは疑問です。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は、最上位 8 ビットがアルファである 32 ビット整数を示します。リトルエンディアン マシンでは、同じ 8 ビットがバイト シーケンスの最後のバイトになります。

シーケンス内の個々のビットを含む形式は、Format_RGB888エンディアンに依存しません。Format_RGB888エンディアンに関係なく、バイトはR、G、Bの順にメモリに配置されます。

バッファー内のバイトにアクセスするには、Q_BYTE_ORDERマクロを使用して、シフトを使用する代わりに、対応するバイト アクセス コードで条件付きでコンパイルします。

Format_RGB888画像内でアルファを直接処理しないため、個人的に使用します。これにより、エンディアンの違いを処理する問題が解決されます。

于 2012-10-19T17:05:33.043 に答える
0

Qtドキュメントから:

警告: 32 bpp の画像データにアクセスしている場合は、返されたポインターを QRgb* (QRgb のサイズは 32 ビット) にキャストし、それを使用してピクセル値を読み書きします。ピクセル形式は基盤となるプラットフォームのバイト順序に依存するため、uchar* ポインターを直接使用することはできません。ピクセルにアクセスするには、qRed()、qGreen()、qBlue()、qAlpha() を使用します。

于 2012-10-19T14:07:50.470 に答える