Отрисовка WriteableBitmap
В программе необходимо быстро рисовать на изображении. Для этого выбрал WriteableBitmap, с BackBuffer произвожу нужные манипуляции. И всё благополучно отрисовывается, пока размер изображения не превышает какой-то предел в районе 1500 пикселей. Свыше этого размера вместо нужной фигуры, появляется нечто другое.
writeable.Lock();
IntPtr buff = writeable.BackBuffer;
unsafe
{
byte* pbuff = (byte*)buff.ToPointer();
...
}
writeable.AddDirtyRect(new Int32Rect(0, 0, (int)writeable.Width, (int)writeable.Height));
writeable.Unlock();
Вверху неверный результат отрисовки, внизу как должно примерно выглядеть (круглая кисть). Если обновлять не всё изображение, а только изменяемую область, то результат идентичен обновлению всего изображения. В чём заключается проблема? Это особенность BackBuffer или ещё какие-то ограничения на размер WriteableBitmap? И что с этим делать, если необходима очень быстрая отрисовка на изображениях в 15-30 мегапикселей?
Ответы (1 шт):
Дело было в способе доступа к BackBuffer. Вот так не работает на больших изображениях:
writeable.Lock();
IntPtr buff = writeable.BackBuffer;
unsafe
{
byte* pbuff = (byte*)buff.ToPointer();
pbuff[Index * 3 + 0] = (byte)(B);
pbuff[Index * 3 + 1] = (byte)(G);
pbuff[Index * 3 + 2] = (byte)(R);
}
writeable.AddDirtyRect(new Int32Rect(0, 0, writeable.PixelWidth, writeable.PixelHeight));
writeable.Unlock();
А вот так работает:
writeable.Lock();
unsafe
{
long pBackBuffer = (long)writeable.BackBuffer;
int stride = writeable.BackBufferStride;
int offset = (int)(RelativeY * stride + RelativeX * 3);
long pBackBufferWithOffset = pBackBuffer + offset;
*((byte*)pBackBufferWithOffset + 0) = (byte)(B);
*((byte*)pBackBufferWithOffset + 1) = (byte)(G);
*((byte*)pBackBufferWithOffset + 2) = (byte)(R);
}
writeable.AddDirtyRect(new Int32Rect(0, 0, writeable.PixelWidth, writeable.PixelHeight));
writeable.Unlock();
Важно использовать именно long, а не int.
