外部システムから、一連の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秒以上かかる場合があります。ループを並列化するのは簡単ですが、これを行うにはさらに良い方法があると思います。どんな助けでも大歓迎です!