netlib.narod.ru< Назад | Оглавление | Далее >

Класс Bitmap

Выше мы обсуждали работу с объектами типа Image. Как я уже говорил в начале этой главы, пространство имен System.Drawing также включает класс Bitmap, наследуемый от Image. Все свойства Image применимы и к Bitmap. Любые операции, допустимые в отношении Image, допустимы и в отношении Bitmap. И, кроме того, класс Bitmap позволяет работать прямо с битами растрового изображения.

У класса Image нет конструкторов, а у Bitmap их 12. Следующие конструкторы загружают объект Bitmap из файла, потока или ресурса.


Конструкторы Bitmap (выборочно)



Bitmap(string strFilename)
Bitmap(string strFilename, bool bUseImageColorManagement)
Bitmap(Stream stream)
Bitmap(Stream stream, bool bUseImageColorManagement)
Bitmap(Type type, string strResource)


Первые четыре по сути дублируют статические методы FromFile и FromStream класса Image. Пятый конструктор загружает объект Bitmap из ресурсов, обычно встраиваемых в .ехе-файлы приложений. Подробнее о ресурсах мы поговорим далее в этой главе.

Далее приведен набор конструкторов, которые создают новые объекты Bitmap на основе существующих объектов Image:


Конструкторы Bitmap (выборочно)



Bitmap(Image image)
Bitmap(Image image, Size size)
Bitmap(Image image, int cx, int cy)


Хотя первый аргумент этих конструкторов определен как Image, он может быть и другим объектом Bitmap. Первый конструктор аналогичен методу Clone класса Image — он создает идентичный исходному новый объект Bitmap. Второй и третий похожи на метод GetThumbnailImage — они изменяют размер изображения. Во всех случаях новое растровое изображение наследует формат пикселов исходного изображения, а разрешение нового изображения устанавливается равным разрешению дисплея.

Последние четыре конструктора не имеют аналогов в классе Image. Они создают новые объекты Bitmap с пустыми изображениями.


Конструкторы Bitmap (выборочно)



Bitmap(int cx, int су)
Bitmap(int cx, int су, PixelFormat pf)
Bitmap(int cx, int су, Graphics grfx)
Bitmap(int cx, int cy, int cxRowBytes, PixelFormat pf, IntPtr pBytes)


Первые три инициализируют пикселы значением 0, которое в различных форматах битовых карт имеет разный смысл. В битовых RGB-картах 0 соответствует черному цвету. В ARGB-картах 0 обозначает прозрачность. Четвертый конструктор также может принимать указатель на массив байтов, инициализирующий растровое изображение.

Первый конструктор создает объект Bitmap заданного размера с форматом пикселов PixelFormat.Format32bppArgb. Это 32 бита на пиксел с альфа-каналом, определяющим прозрачность. Горизонтальное и вертикальное разрешения задаются равными разрешению дисплея. Второй конструктор позволяет указать элемент перечисления PixelFormat, если вас не устраивает формат PixelFormat.Format32bppArgb.

Третий конструктор позволяет указать объект Graphics. Независимо от того, связан указанный объект с дисплеем или принтером, и независимо от того, является ли принтер цветным, этот конструктор всегда создает объект Bitmap с форматом пикселов PixelFormat.Format32bppPArgb. Заметьте: данный формат пикселов предполагает, что значение альфа-канала уже учтено в отдельных компонентах. Самое важное следствие создания битовой карты на основе объекта Graphics — то, что свойствам HorizontalResolution и VerticalResolution объекта Bitmap задаются значения свойств DpiX и DpiY объекта Graphics. Для принтера это означает не 100, а 300, 600, 720 и больше dpi.

Например, разрешение вашего принтера — 600 dpi. Вам нужно растровое изображение, созданное на основе разрешения принтера. И зачем вам это? Затем, что при печати растрового изображения все на нем (включая текст) должно выглядеть настолько красивым и плавным, насколько позволяет разрешение принтера. Квадратное растровое изображение со стороной 2 дюйма и разрешением 600 dpi будет иметь пиксельный размер 1 200 × 1 200 пикселов и займет 5 Мб памяти. Помните, что при выводе такого растрового изображения на экран или принтер надо использовать его метрический размер! (Не волнуйтесь — скоро мы рассмотрим это на примере.)

Если вы создаете растровые изображения, разрешения которых не соответствуют ни экранному разрешению, ни разрешению принтера, можно изменить разрешение загруженного или созданного растрового изображения с помощью метода SetResolution класса Bitmap.


Методы Bitmap (выборочно)



void SetResolution(float xDpi, float yDpi)


Как нарисовать что-либо на растровом изображении? Есть три подхода.

К сожалению, я не смогу продемонстрировать второй и третий подходы в этой книге.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz