2017-09-05 17 views
-1

R8G8B8A8画像をR8G8B8画像に変換しようとしていますが、現在は画像がありますが、スキャンラインがたくさんあるため、1ピクセルあたりのバイト数は4バイト、32ビットです。R8G8B8A8画像をR8G8B8にコピー

イメージバッファのタイプはunsigned char [width * height * 4]で、ソースはunsigned char [width * height * 3]です。

int j = 0; 
    int i = 0; 
    for (int k = 0; k < (width*height); k++) 
    { 
     for(int b = 0; b < 3; b++) 
     { 
      dst[i + b] = src[j + b]; 

     } 
     i+=3; 
     j+=4; 
    } 
+1

をそして、あなたが抱えている問題は何ですか? – molbdnilo

+0

プラットフォームに応じて、これを行う簡単な方法があるかもしれませんが、私はWindows Imagingコンポーネントがこれを行うことを知っています。私はlibpngが同様のことをすると思います。(簡単なGoogleの検索によると、 'PNG_TRANSFORM_STRIP_ALPHA'は物事です) – Mgetz

+0

@molbdnilo:それはやや非効率です(無関係のループ状態、' i == 3 * width * – MSalters

答えて

0

をおそらく先の画像は、4バイト境界に位置合わせの線が必要です。

for(unsigned int y(0); y != height; ++y) 
{ 
    unsigned int sourceStart(y * width * 4); 
    unsigned int destStart(y * ((width * 3 + 3) & 0xfffffffc)); // align on 4 bytes 
    for(unsigned int x(0); x != width; ++x) 
    { 
     for(unsigned int color(0); color != 3; ++color) 
     { 
      dst[destStart++] = src[sourceStart++]; 
     } 
     ++sourceStart; // account for 4th byte in source 
    } 
} 
+0

私が見つけたのは、ソースイメージが幅480で高さが640なので、処理は逆でなければなりませんか、それとも正しいでしょうか?それとも、「j = 4 * width * height」でしょうか。重要ではありませんか?dst画像は幅640と高さ480でなければなりません – andre

0

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

for (int k = 0; k < width*height; k++) 
{ 
    for(int b = 0; b < 3; b++) 
    { 
     dst[k*3 + b] = src[k*4 + b]; 

    } 
} 
関連する問題