Описание тега writeablebitmap

Растровые изображения обычно реализуются в WPF как неизменяемые объекты. Это означает, что после создания растрового изображения вы не можете вносить в него какие-либо изменения. Вы можете манипулировать растровыми изображениями, создавая новые версии, которые затем сразу становятся неизменяемыми, и иногда это хороший способ работы. Неизменяемые растровые изображения могут быть очень эффективными, если вы не хотите заниматься множеством динамических изменений, и в этом случае накладные расходы на их создание и уничтожение быстро становятся слишком дорогими. В этой ситуации вам нужно что-то более гибкое - WriteableBitmap. WriteableBitmap, как следует из названия, не является неизменным, и вы можете обращаться к его отдельным пикселям и манипулировать ими столько, сколько захотите. Это идеальный способ работы, когда вам нужны динамические растровые изображения. Итак, давайте посмотрим на WriteableBitmap, как он работает и как использовать его для выполнения динамических задач.Обратите внимание, что класс WriteableBitmap в Silverlight сильно отличается от того же класса в WPF. Чтобы использовать WriteableBitmap, нам нужно добавить:

using System.Windows.Media.Imaging;

который содержит все необходимые нам дополнительные возможности растрового изображения. Вы можете создать WriteableBitmap двумя способами. Чаще всего используется просто указание размера и формата растрового изображения:

 WriteableBitmap wbmap = new 
      WriteableBitmap(100, 100, 300,
       300, PixelFormats.Bgra32, null);

Это определяет WriteableBitmap 100 на 100 пикселей с разрешением 300 на 300 точек на дюйм с использованием формата пикселей Bgra32. Каждый пиксель, 32-битное int, использует четырехбайтовую BGRA, то есть пиксель состоит из байта, дающего значения Blue, Green, Red и Alpha. Последний параметр используется для указания палитры, если она требуется формату. Вы можете указать широкий диапазон форматов для создаваемого растрового изображения, и в каждом случае для представления каждого пикселя требуется заданное количество бит, и вам нужно выяснить, как биты, выделенные для каждого пикселя, определяют его цвет. Второй метод создания WriteableBitmap - основать его на существующем BitmapSource или производном классе. Например, вы должны иметь возможность создать WriteableBitmap из стандартного растрового изображения с помощью конструктора: WriteableBitmap(bitmapsource);но если вы попробуете это с BitmapImage, загруженным из URI, вы получите ошибку нулевого объекта. Причина в том, что растровое изображение еще не загружено. Для локального файла загрузка растрового изображения блокирует выполнение, пока он не загрузится:

 Uri uri = new Uri(@"pack://application:
       ,,,/Resources/mypic.jpg");
 BitmapImage bmi = new BitmapImage(uri);
 WriteableBitmap bmi2 = new
            WriteableBitmap(bmi);
 image1.Source = bmi2;

В этом случае WriteableBitmap создается без проблем. Однако если URI был URL-адресом HTTP, загрузка не блокировала бы выполнение, и результатом была бы ошибка.