Как избежать исключения «Размер буфера WriteableBitmap не является достаточным» для формата Bgr24? - PullRequest
1 голос
/ 04 октября 2019

Я хочу создать WriteableBitmap, а затем установить его как Image.Source. Меня интересует только RGB с полной непрозрачностью, поэтому я выбрал формат Bgr24.

Теперь, когда я пытаюсь записать несколько пикселей в растровое изображение, используя WritePixels() Iполучить Размер буфера недостаточен исключение.

 wb = new WriteableBitmap(255, 255, 96d, 96d, PixelFormats.Bgr24, null);

            for (int x = 0; x < wb.PixelWidth; x++)
            {
                for (int y = 0; y < wb.PixelHeight; y++)
                {
                    byte blue = GetBlue();
                    byte green = GetGreen();
                    byte red = GetRed();
                    byte[] pixelColor = { blue, green, red };

                    // position where the pixel will be drawn
                    Int32Rect rect = new Int32Rect(x, y, 1, 1);
                    int stride = wb.PixelWidth * wb.Format.BitsPerPixel / 8;

                    // Write the pixel.
                    wb.WritePixels(rect, pixelColor, stride, x);
                }
            }

Вот мой вопрос, не достаточно ли pixelColor размер (3 байта) для этой операции?

Редактировать

Это работает, только если я инициализирую WriteableBitmap как с width и height из 1.

 wb = new WriteableBitmap(255, 255, 96d, 96d, PixelFormats.Bgr24, null); 

Является ли размер rect s проблемой?

1 Ответ

2 голосов
/ 04 октября 2019

Вы неправильно использовали x в качестве смещения входного буфера, которое должно быть равно нулю:

wb.WritePixels(rect, pixelColor, stride, 0);

Вы также можете использовать x и y непосредственно в качестве значений назначения с соответствующим исходным прямоугольникоми шагать, как

wb.WritePixels(new Int32Rect(0, 0, 1, 1), pixelColor, 3, x, y);
...