0

C++でBGRAバッファをRGBAバッファ形式に変換するにはどうすればよいですか?

void ConvertBetweenBGRAandRGBA(unsigned char* input, int pixel_width,int pixel_hight,
                           unsigned char* output) {

        for (int y = 0; y < pixel_hight; y++) {
        for (int x = 0; x < pixel_width; x++) {
        const unsigned char* pixel_in = &input[y * x * 4];

        unsigned char* pixel_out = &output[y * x * 4];
        pixel_out[0] = pixel_in[2];
        pixel_out[1] = pixel_in[1];
        pixel_out[2] = pixel_in[0];
        pixel_out[3] = pixel_in[3];
     }
}

しかし、背景色が表示されません。

pls誰かが私を助けますか?

4

2 に答える 2

3

これは C# ではないため、適切にタグ付けし直してください。

これがビットマップ データであると仮定すると、まず、画像のストライドを把握する必要があります。ストライドは、ピクセルの各行が使用するバイト数です。これは常に と等しいとは限りませんbytes_per_pixel * pixels_per_row。通常は 4 バイトにアラインされているため、この場合 (ARGB ピクセルは 1 ピクセルあたり 4 バイトを使用するため) 問題ありません。

次に、ピクセル (x, y) のアドレスを取得する式が間違っています。ピクセルは行優先順に格納されます。これは、ピクセル バッファのオフセット 0 から始まる、ピクセル データの 1 つの完全な行が表示されることを意味します。次に、別の完全な行。等々。ピクセル データの各行には、完全なバイト幅があります。

あなたはこれを行うことができます:

const unsigned char* pixel_in = &input[((y * pixel_width) + x) * 4];

ただし、ストライドが実際に画像の幅と等しい場合は、ピクセルが順番に格納されるため、毎回アドレスを計算する必要はありません。

void ConvertBetweenBGRAandRGBA(unsigned char* input, int pixel_width,
    int pixel_height, unsigned char* output)
{
    int offset = 0;

    for (int y = 0; y < pixel_height; y++) {
        for (int x = 0; x < pixel_width; x++) {
            output[offset] = input[offset + 2];
            output[offset + 1] = input[offset + 1];
            output[offset + 2] = input[offset];
            output[offset + 3] = input[offset + 3];

            offset += 4;
        }
    }
}

それでも正しく表示されない場合は、正しいピクセル パッキングを確認してください。ARGB または BGRA のいずれかである必要があります。RGBA としてパックされたピクセルについては聞いたことがありません。

于 2012-11-16T19:43:40.407 に答える