Я пытаюсь создать битовый массив из необработанных данных для показа в WPF, при помощи Изображения и BitmapSource:
Int32[] data = new Int32[RenderHeight * RenderWidth];
for (Int32 i = 0; i < RenderHeight; i++)
{
for (Int32 j = 0; j < RenderWidth; j++)
{
Int32 index = j + (i * RenderHeight);
if (i + j % 2 == 0)
data[index] = 0xFF0000;
else
data[index] = 0x00FF00;
}
}
BitmapSource source = BitmapSource.Create(RenderWidth, RenderHeight, 96.0, 96.0, PixelFormats.Bgr32, null, data, 0);
RenderImage.Source = source;
Однако вызов к BitmapSource. Создайте бросает ArgumentException, говоря, что "Значение не находится в пределах ожидаемого диапазона". Разве это не способ сделать это? Разве я не выполняю тот вызов правильно?
Your stride is incorrect. Шаг - это количество байт, выделенных для одной строки сканирования карта. Таким образом, используйте следующее:
int stride = ((RenderWidth * 32 + 31) & ~31) / 8;
и замените последний параметр (в настоящее время 0
) на шаг
, как определено выше.
Вот объяснение загадочной формулы шага:
Факт: Сканирующие линии должны быть выровнены по 32-битным границам (ссылка).
Наивная формула для количества байт на строку сканирования была бы:
(width * bpp) / 8
Но это могло бы не дать нам растровое изображение, выровненное по 32-битной границе и (ширина * bpp) могло бы даже не делиться на 8.
Итак, что мы делаем, так это заставляем нашу растровую карту иметь как минимум 32 бита подряд (мы предполагаем, что ширина > 0
):
width * bpp + 31
и затем говорим, что нас не волнуют младшие биты (биты 0--4). потому что мы пытаемся выровнять по 32-битной границе:
(width * bpp + 31) & ~31
и затем поделить на 8, чтобы вернуться к байтам:
((width * bpp + 31) & ~31) / 8
Пэддинг можно вычислить по
int padding = stride - (((width * bpp) + 7) / 8)
Наивная формула была бы
stride - ((width * bpp) / 8)
Но ширина * bpp
может не выровняться по границе байта, а если не выровнять по этой формуле, то это пересчет пэддингов на байт. (Подумайте о растровой карте шириной 1 пиксель с использованием 1 bpp. Шаг 4, и наивная формула скажет, что прокладка равна 4, но на самом деле она равна 3). Итак, добавим немного, чтобы покрыть случай, когда ширина * bpp
не является границей байта, и тогда мы получим правильную формулу, приведенную выше.