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

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

Изменить: я пытался изменить код из этой статьи: 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;
    }

Теперь значение не соответствует ожидаемому диапазону. StackTrace не говорит, какой...

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

3 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам