Почему делает BitmapSource. Создайте бросают ArgumentException?

Я пытаюсь создать битовый массив из необработанных данных для показа в 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, говоря, что "Значение не находится в пределах ожидаемого диапазона". Разве это не способ сделать это? Разве я не выполняю тот вызов правильно?

7
задан jason 31 December 2009 в 04:55
поделиться

1 ответ

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 не является границей байта, и тогда мы получим правильную формулу, приведенную выше.

.
38
ответ дан 6 December 2019 в 05:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: