私は現在これを持っています。
private const int PixelSizeBGR = 3;
[StructLayout(LayoutKind.Explicit)]
private unsafe struct BGR5
{
[FieldOffset(0)]
private fixed byte bgr[PixelSizeBGR * 5];
public BGR5(byte b, byte g, byte r)
{
fixed (byte* v = bgr)
{
int num = 0;
do
{
v[num++] = b; v[num++] = g; v[num++] = r;
} while (num < (PixelSizeBGR * 5));
}
}
}
[StructLayout(LayoutKind.Explicit)]
private unsafe struct BGR3
{
[FieldOffset(0)]
private fixed byte bgr[PixelSizeBGR * 3];
public BGR3(byte b, byte g, byte r)
{
fixed (byte* v = bgr)
{
int num = 0;
do
{
v[num++] = b; v[num++] = g; v[num++] = r;
} while (num < (PixelSizeBGR * 3));
}
}
}
私が考えるパターンを見ることができます。
これらがもっと必要であることがわかるかもしれないので、動的にする方法はありますか?
または代替手段はありますか?
実際の例;
BEFORE、24000 ピクセル x 24000 ピクセルのビットマップ、2151 ミリ秒
byte* row = (byte*)bmd.Scan0;
/*** stuff ***/
Offset1 = ((CurrentPos / GridX) * FullRow) + ((CurrentPos % GridX) * FullSquare);
for (k = PixelSize; k <= w; k += PixelSize)
{
Offset1 += PixelSize;
for (l = Stride; l <= h; l += Stride)
{
row[l + Offset1] = 0; //b
row[l + Offset1 + 1] = 255; //g
row[l + Offset1 + 2] = 255; //r
}
}
/*** more stuff ***/
AFTER、24000 ピクセル x 24000 ピクセルのビットマップ、944 ミリ秒
byte* row = (byte*)bmd.Scan0;
/*** stuff ***/
np5.Set(0, 255, 255);
Offset1 = ((CurrentPos / GridX) * FullRow) + ((CurrentPos % GridX) * FullSquare) + PixelSizeBGR;
h = Stride;
do
{
*((BGR5*)(row + h + Offset1)) = np5;
h += Stride;
} while (h < FullRow);
/*** more stuff ***/
AFTER は 50% 以上高速です