У меня сейчас это;
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));
}
}
}
вы можете увидеть образец, я думаю.
Есть ли способ сделать его динамичным, так как я могу узнать, что мне нужно больше из них?
или есть альтернатива?
практический пример;
ДО, растровое изображение 24000 на 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 ***/
ПОСЛЕ, растровое изображение 24000 на 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 ***/
ПОСЛЕ более чем на 50% быстрее
for (k = 0; k <= w; ++k)
, что экономит от 15% до 20% времени обработки. в конце структура ведет себя как разворачивание цикла. - person Fredou   schedule 14.08.2013