0

外部システムから、一連のBGR値とそれに続く空のバイトの形式で画像を受信して​​います。シーケンスは次のようになります...

[B、G、R、0、B、G、R、0、...、B、G、R、0]ここで、各BGR0は画像内の単一ピクセルです。

.NETビットマップでこれが必要なので、いくつかの操作を実行でき、そのための次の関数を考え出しました。

    private Bitmap fillBitmap(byte[] data, int width, int height)
    {
        Bitmap map = new Bitmap(width, height);
        for (int i = 0; i < data.Length; i += 4)
        {
            int y = ((i / 4) / width);
            int x = ((i / 4) - (y * width));
            int b = data[i];
            int g = data[i + 1];
            int r = data[i + 2];
            Color pixel = Color.FromArgb(r, g, b);
            map.SetPixel(x, y, pixel);
        }
        return map;
    }

ほとんどの画像が1920x1200であることを除けば、これは通常は問題ありません...したがって、200万回以上繰り返されるループがあります。それでも、200万回の反復が最新のプロセッサに大きな負担をかけることはないので、それほど悪くはありません。

しかし、何らかの理由で、このループは、私のサーバー上のかなり頑丈なXeonで実行されるのに5〜15秒以上かかる場合があります。ループを並列化するのは簡単ですが、これを行うにはさらに良い方法があると思います。どんな助けでも大歓迎です!

4

3 に答える 3

2

Bitmap.LockBitsメソッドの説明によると、

LockBitsメソッドは大規模な変更に対してより優れたパフォーマンスを提供しますが、SetPixelメソッドを使用して画像の色を変更できます。

別の方法としては、ビットマップのファイル形式に一致するStreamを作成した後、 Bitmap(Stream)コンストラクターを使用することもできます。

于 2012-11-19T22:36:07.883 に答える
0

イメージを生成できる配列を設定するのに役立つFastBitmapの実装を確認してください。

于 2012-11-19T22:31:36.183 に答える
0

GetPixelとSetPixelを呼び出すと、ネイティブ関数が相互運用されます。関数の1つを呼び出すたびに、ビットマップイメージがロックされ、対応するピクセル/バイトが変更され、イメージが最終的にロック解除されます。これを繰り返し実行することは非常に非効率的であることが想像できます。

他の人がLockBitsメソッドを使用することを提案しているように、私が想像する安全でないコードを使用する必要があります。これが許可されている場合は、それを使用してください。これにより、アンマネージメモリバッファ内のビットマップのピクセルに直接アクセスできます。

于 2012-11-19T22:42:46.680 に答える