4

GIMP では、画像を C ヘッダー ファイルとして保存できます。以下の画像のような XPM ファイルを使用してこれを行いました。

XPM イメージを C ヘッダー ファイルとして保存すると、GIMP はこの C ヘッダー ファイルを出力します。

与えられた画像データの各ピクセルを処理するために、ヘッダー ピクセルが繰り返し呼び出されます。私が理解していないのは、ヘッダー ピクセルが最初にデータを処理するために行うことです。

#define HEADER_PIXEL(data,pixel) {\
pixel[0] = (((data[0] - 33) << 2) | ((data[1] - 33) >> 4)); \
pixel[1] = ((((data[1] - 33) & 0xF) << 4) | ((data[2] - 33) >> 2)); \
pixel[2] = ((((data[2] - 33) & 0x3) << 6) | ((data[3] - 33))); \
data += 4; \
}

別の人のコードで使用されているのを見たとき、彼らはバイトオーダーが間違った順序であると述べ、自分で再配置しました。彼らはそれを次のように使用しました:

char *pixel, *data = header_data;
int i = width * height;
*processed_data = pixel = malloc(i * 4 + 1);
while(i-- > 0) {
    pixel[0] = ((((data[2] - 33) & 0x3) << 6) | ((data[3] - 33)));
    pixel[1] = ((((data[1] - 33) & 0xF) << 4) | ((data[2] - 33) >> 2));
    pixel[2] = (((data[0] - 33) << 2) | ((data[1] - 33) >> 4));
    pixel[3] = 0;
    data += 4;
    pixel += 4;
}

しかし、それは、すべてのビットシフトとビットごとの or と「なぜマイナス 33 なのか」で何が起こっているのかを理解するのに本当に役立ちませんでした。など。ヘッダーの画像データに何が処理されているかについて誰かが説明できれば、それは大歓迎です。

前もって感謝します!

4

1 に答える 1

4

各ピクセルは 3 バイトで表されます。これらのピクセルは、 という名前の文字配列として定義されheader_dataます。

問題は、すべてのバイトがそのヘッダー ファイルに存在する可能性のある印刷可能な文字ではないことです。

これは、33を通じて印刷可能な文字のみを使用することで解決され97ます。これは 6 ビットの情報を提供するため、4 文字ごとに 24 ビットが提供され、3 バイトのすべての順列を表すことができます。

于 2012-01-16T04:38:44.523 に答える