Главная » Разработка для Windows Phone 7 » Растровая графика Windows Phone 7

0

В главе 4 я продемонстрировал, как приложение для Windows Phone 7 может получать растровые изображения. Они могут храниться в самом приложении, загружаться из Интернета либо поступать с камеры или из библиотеки изображений телефона. В данной главе мы выйдем за рамки задачи загрузки растровых изображений и обратимся к вопросам их сохранения. Растровые изображения могут сохраняться в изолированное хранилище или специальный альбом библиотеки изображений под именем «Saved Pictures» (Сохраненные изображения).

Если приложению необходимо сохранять растровое изображение, вероятно, для этого есть веские основания! Возможно, приложение создает растровое изображение с нуля или некоторым образом изменяет существующее. Для реализации этих задач используется замечательный и обладающий огромными возможностями класс WriteableBitmap.

Иерархия класса Bitmap

Как помните, существует два способа вывести растровое изображение на экран: с помощью элемента Image или создав ImageBrush. И свойство Source элемента Image, и свойство ImageSource объекта ImageBrush типа ImageSource. Класс ImageSource занимает очень важное место в разделе иерархии классов Silverlight, посвященном растровым изображениям:

Object

DependencyObject (абстрактный)

ImageSource (абстрактный)

BitmapSource (абстрактный) BitmapImage WriteableBitmap

ImageSource имеет всего один класс-потомок и ни одного самостоятельно описанного открытого свойства, что наводит на мысль о его ненужности. Но такова ситуация только в Silverlight. В Windows Presentation Foundation от класса ImageSource наследуются классы, описывающие изображения, полученные средствами как векторной, так и растровой графики.

Остальные три класса описаны в пространстве имен System.Windows.Media.Imaging. BitmapSource определяет два открытых свойства только для чтения и один метод:

•                                  Свойство PixelWidth (Ширина в пикселах) типа int.

•                                  Свойство PixelHeight (Высота в пикселах) типа int.

•                                  Метод SetSource, имеющий один аргумент типа Stream.

Аргумент Stream может быть файловым потоком, сетевым потоком или потоком в памяти некоторого вида. Но Stream должен обеспечивать данные растрового изображения либо в формате JPEG, либо PNG. Создаваемое растровое изображение имеет фиксированный размер, который не может быть изменен.

Класс BitmapImage расширяет функциональность BitmapSource возможностью ссылаться на растровое изображение посредством URI. BitmapImage предоставляет следующие члены:

•          Конструктор, принимающий аргумент типа Uri.

•          Свойство UriSource типа Uri.

•          Свойство CreateOptions (Параметры инициализации).

•         Три события, которые позволяют отслеживать процесс загрузки и сообщать об его успешном завершении или сбое.

Свойство CreateOptions типа CreateOptions – это перечисление, включающее три члена: None, DelayCreation (Отложить инициализацию) и IgnoreImageCache (Игнорировать кэш изображения). Значение по умолчанию – DelayCreation, что не дает начать загрузку изображения до тех пор, пока оно действительно не потребуется для формирования визуального представления. Значение IgnoreImageCache используется, если приложение знает, что ранее загруженное изображение стало недействительным. DelayCreation и IgnoreImageCache можно использовать в сочетании с оператором C# побитовое ИЛИ.

Сочетая в себе функциональность BitmapSource и BitmapImage, класс BitmapImage позволяет загружать растровые изображения в формате JPEG или PNG, используя либо объект Stream, либо объект Uri. Он не предоставляет возможности сохранять растровые изображения.

Класс WriteableBitmap тоже продолжает эту традицию. Сам по себе он не имеет никакой функциональности для сохранения растровых изображений, но предоставляет доступ ко всем пикселам, образующим растровое изображение. Поддерживается только один формат пикселов, при котором каждый пиксел представлен 32-разрядным значением. Мы можем получить значения пикселов существующего растрового изображения или задать новые значения пикселов для WriteableBitmap и получить новое изображение. Доступ к значениям пикселов обеспечивает достаточно большую гибкость для сохранения или загрузки растровых изображений. Можно создать собственный «кодер» растровых изображений и сохранять значения пикселов в определенном растровом формате или собственный «декодер» для доступа к файлам определенного формата и преобразования их в значения пикселов без сжатия.

WriteableBitmap также предоставляет возможность для «рисования» изображений на битовой матрице, используя элементы Silverlight. Так можно нанести на битовую матрицу элементы Button и Slider, но чаще всего для этого используются элементы, наследуемые от Shape. Иначе говоря, WriteableBitmap позволяет преобразовывать векторный рисунок в растровое изображение.

Класс WriteableBitmap описывает следующие конструкторы, методы и свойства:

•          Конструктор, принимающий UIElement и объект трансформации.

•          Конструктор, принимающий ширину и высоту изображения в пикселах.

•          Конструктор, принимающий объект BitmapSource.

•         Метод Render (Формировать визуальное представление) принимает UIElement и объект трансформации.

•         Метод Invalidate (Аннулировать) для обновления визуальных элементов растрового изображения.

•          Свойство Pixels (Пикселы) – массив элементов типа int.

Не забывайте, что WriteableBitmap наследуется от класса BitmapSource, а не BitmapImage, поэтому не имеет возможности загрузки растрового изображения по URI. Но мы можем

загрузить так, с помощью URI, объект BitmapImage и затем создать из него WriteableBitmap, используя третий из перечисленных выше конструктор.

WriteableBitmap позволяет размещать изображения в растровой матрице, используя две техники:

•                                  Путем формирования визуального представления объекта UIElement в растровой матрице.

•                                  Прямой обработкой значений пикселов.

Эти техники могут сочетаться любым удобным способом.

Кроме того, Windows Phone 7 предоставляет несколько вспомогательных методов, которые обеспечивают альтернативные способы загрузки и сохранения файлов в формате JPEG:

•         Статический метод PictureDecoder.DecodeJpeg, описанный в пространстве имен Microsoft.Phone, позволяет загружать файлы в формате JPEG из Stream с ограничением максимальных значений Width и Height. Это необходимо, если известно, что определенное изображение в формате JPEG может намного превышать имеющуюся область отображения. Метод возвращает объект WritableBitmap.

•         Класс Extensions (Расширения) из пространства имен System.Windows.Media.Imaging включает два метода расширения для WriteableBitmap: LoadJpeg (Загрузить JPEG) (который не обеспечивает никакой дополнительной функциональности, кроме метода SetSource, определенного BitmapSource) и метод SaveJpeg (Сохранить JPEG), который позволяет менять высоту и ширину изображения и задавать качество сжатия.

•         Метод SavePicture (Сохранить изображение) XNA-класса MediaLibrary позволяет сохранять растровое изображение в формате JPEG в библиотеку изображений телефона из объекта Stream или байтового массива. Этот метод лучше использовать в сочетании с методом расширения SaveJpeg с объектом-посредником MemoryStream, как я продемонстрирую ближе к концу данной главы.

Источник: Чарльз Петзольд, Программируем Windows Phone 7, Microsoft Press, © 2011.

По теме:

  • Комментарии