1

SDK から、ピクセル形式の BGR がパックされた画像を取得しますBGRBGRBGR。別のアプリケーションでは、この形式を RGB 平面 に変換する必要がありますRRRGGGBBB

私は C# .NET 4.5 32 ビットを使用しており、データは同じサイズのバイト配列になっています。

現在、配列ソースを反復処理して、BGR値をターゲット配列の適切な場所に割り当てていますが、時間がかかりすぎます (1.3 メガピクセルの画像で 180 ミリ秒)。コードが実行されるプロセッサは、MMX、SSE、SSE2、SSE3、SSSE3 にアクセスできます。

変換を高速化する方法はありますか?

編集:これが私が使用している変換です:

// the array with the BGRBGRBGR pixel data
byte[] source;
// the array with the RRRGGGBBB pixel data
byte[] result;
// the amount of pixels in one channel, width*height
int imageSize;

for (int i = 0; i < source.Length; i += 3)
{
    result[i/3] = source[i + 2]; // R
    result[i/3 + imageSize] = source[i + 1]; // G
    result[i/3 + imageSize * 2] = source[i]; // B
}

編集:ソース配列へのアクセスを、チャネルごとに 1 つずつ、3 つのループに分割しようとしましたが、実際には役に立ちませんでした。だから私は提案にオープンです。

for (int i = 0; i < source.Length; i += 3)
{
    result[i/3] = source[i + 2]; // R
}

for (int i = 0; i < source.Length; i += 3)
{
    result[i/3 + imageSize] = source[i + 1]; // G
}

for (int i = 0; i < source.Length; i += 3)
{
    result[i/3 + imageSize * 2] = source[i]; // B
}

質問がまだ回答されていないため、バンプします。どんなアドバイスでも大歓迎です!

4

2 に答える 2

1

SSE3 のPSHUFB - Packed Shuffle Bytes 命令を使用してみてください。アラインされたメモリの読み取り/書き込みを使用していることを確認してください。XMMWORD サイズの各ブロックの最後のぶら下がっている B 値を処理するには、何かトリッキーなことをする必要があります。それを正しくするのは難しいかもしれませんが、大幅なスピードアップになるはずです。ライブラリ コードを探すこともできます。C または C++ DLL を作成して P/Invoke を使用する必要があると思いますが、私が知らない C# から SSE 命令を使用する方法があるかもしれません。

編集 -この質問は、ARGB から BGR へのわずかに異なる問題に関するものですが、使用される手法は必要なものと似ています。

于 2014-12-12T07:50:10.507 に答える