Вызов метода WriteableBitmap.WritePixels

Я пытаюсь вызвать метод WriteableBitmap.WritePixels, но я не могу понять параметры. Статья MSDN очень скучна (или shuold я говорю... null?), И я не мог понять, как использовать этот метод.

Edit: Я попытался изменить код из этой статьи: http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap%28v=VS.90%29.aspx

        PixelFormat pf = PixelFormats.Rgba128Float;
        WriteableBitmap wb = new WriteableBitmap(width * 5, height * 5, 100, 100, pf, new BitmapPalette(new List<Color> { Color.FromArgb(255, 255, 0, 0) }));
        byte[] ColorData = { 0, 0, 0, 0 };
        wb.WritePixels(new Int32Rect(0, 0, 1, 1), ColorData, 4, 0);
        Background.Source = wb;

В строке перед последней строкой отладчик утверждает, что размер буфера (ColorData) недостаточен.

Edit2: Я снова попробовал:

        void RefreshGraphics()
    {
        PixelFormat pf = PixelFormats.Pbgra32;
        WriteableBitmap wb = new WriteableBitmap(width * 5, height * 5, 100, 100, pf, new BitmapPalette(new List<Color> { Color.FromArgb(255, 255, 0, 0) }));
        byte[] ColorData = new byte[1000];
        byte t = 0;
        for (int i = 0; i < 1000; i++)
            ColorData[i] = t++;
        wb.WritePixels(new Int32Rect(0, 0, 10, 10), ColorData, 10, 0);
        Background.Source = wb;
    }

Теперь "Значение не в ожидаемом диапазоне". СтекTrace не указывает, какой из них...

Изменить 3: Задача решена! Не знаю, как и почему, но работает код (и я боюсь изменить его...)

Ответ 1

Проверьте значения высоты и ширины. Возможно, массив байтов просто недостаточно большой.

Ответ 2

В этой статье (для .NET 3) есть некоторые комментарии в примерах, которые помогают объяснить, что представляют собой различные параметры (такие как "шаг" ) и как рассчитать их. Прокрутите страницу вниз, где представлены фактические примеры кода. Я не уверен, почему они сбросили эти комментарии из версии .NET 4.

Изменить: Можете ли вы поделиться своей целью с WritePixels? Если вы пытаетесь рисовать изображения, фигуры и т.д., Я обычно использую DrawingContext для записи в растровое изображение, а затем вместо него выделяю DrawingVisual.

Ответ 3

Вот так я понимаю:

  • System.Windows.Int32Rect sourceRect: наиболее очевидный аргумент. Представляет позицию, ширину и высоту подмножества вашего растрового изображения, которое вы пытаетесь записать.
  • Фильтры System.Array: один или два размера массива байтов. Формат пикселя, который вы использовали в конструкторе растрового изображения, определит, сколько байтовых записей используется для каждого пикселя.
  • System.Int32 stride: определяет, сколько из элементов массива пикселей должно использовать каждая строка (ширина)
  • Смещение System.Int32: смещение в вашем массиве входных пикселей, если вы хотите повторно использовать свой массив для более чем одного вызова WritePixels.