netlib.narod.ru | < Назад | Оглавление | Далее > |
Класс Image включает несколько свойств, предоставляющих сведения об объекте. Первыми идут три свойства, указывающие размер изображения в пикселах:
Свойства класса Image (выборочно)
Тип | Свойство | Доступ |
Size | Size | Чтение |
int | Width | Чтение |
int | Height | Чтение |
Свойства Width и Height согласуются со свойством Size. Используйте то, что больше вам подходит.
Большинство современных форматов растровых изображений также включает сведения о разрешении изображения в точках на дюйм или аналогичных метриках. Для некоторых изображений, в том числе и того, которое я использую, сведения о разрешении не имеют смысла. Вы можете увеличивать или уменьшать размер изображения, а оно останется таким же. Однако для некоторых растровых изображений (тех, в которых изображение должно соответствовать размеру отображаемого объекта) указание физического размера картинки может быть полезным.
Чем определяется разрешение? Обычно исходной программой, создавшей растровое изображение. Например, если изображение было отсканировано с разрешением 300 dpi, обрабатывающее ПО обычно задает ему это же разрешение. При создании картинки в приложении для живописи ей обычно задается экранное разрешение (предполагается, что вы создаете изображение для текущего размера экрана).
Дополнительные свойства класса Image позволяют получить горизонтальное и вертикальное разрешение объекта Image, а также итоговый метрический размер.
Свойства класса Image (выборочно)
Тип | Свойство | Доступ | Описание |
float | HorizontalResolution | Чтение | В точках на дюйм |
float | VerticalResolution | Чтение | В точках на дюйм |
SizeF | PhysicalDimension | Чтение | В сотых долях миллиметра |
Если изображение не содержит сведений о разрешении, свойства HorizontalResolution и VerticalResolution возвращают разрешение дисплея. Значение свойства PhysicalDimension (в частности потому, что в ранних версиях Windows Forms оно не работает) можно проигнорировать и вычислить метрический размер картинки самостоятельно. Так, следующие инструкции вычисляют размер в дюймах:
float cxInches = image.Width / image.HorizontalResolutlon; float cyInches = image.Height / image.VerticalResolution;
В предыдущих программах этой главы для вывода изображения использовалась такая версия метода DrawImage:
grfx.DrawImage(image, х, у)
Она масштабирует изображение на основе его метрического размера! Именно поэтому в предыдущих программах картинка имела несколько иной размер, чем в приложениях Windows. Методы визуализации изображений мы обсудим ниже.
Еще одно свойства класса Image указывает формат пикселов. Этот формат определяет глубину цвета и то, как пикселы соответствуют цветам.
Свойства класса Image (выборочно)
Тип | Свойство | Доступ |
PixelFormat | PixelFormat | Чтение |
Данное свойство возвращает один из следующих элементов перечисления PixelFormat, определенных в пространстве имен System.Drawing.Imaging:
Перечисление PixelFormat (выборочно)
Член | Значение |
Undefined или DontCare | 0x00000000 |
Format16bppRgb555 | 0x00021005 |
Format16bppRgb565 | 0x00021006 |
Format24bppRgb | 0x00021808 |
Format32bppRgb | 0x00022009 |
Format1bppIndexed | 0x00030101 |
Format4bppIndexed | 0x00030402 |
Format8bppIndexed | 0x00030803 |
Format16bppArgb1555 | 0x00061007 |
Format32bppPArgb | 0x000E200B |
Format16bppGrayScale | 0x00101004 |
Format48bppRgb | 0x0010300C |
Format64bppPArgb | 0x001C400E |
Format32bppArgb | 0x0026200A |
Format64bppArgb | 0x0034400D |
Число после слова Format указывает количество бит на пиксел: 1, 4, 8, 16, 32, 48 или 64. Форматы с разрядностью 1, 4 и 8 bpp являются индексированными, т.е. значения пикселов являются индексами палитры цветов. Форматы, имеющие в названии Rgb, хранят для каждого пиксела значение красной, зеленой и синей составляющих. Форматы Argb также включают альфа-канал, определяющий прозрачность. Форматы PArgb содержат значения красной, зеленой и синей составляющих с учетом альфа-значения. Может показаться, что численные значения элементов перечисления произвольны, однако, изучив их внимательнее, вы заметите определенный порядок. Возьмем, например, две крайних правых шестнадцатеричных цифры. Каждое значение уникально, начиная 0x00 (зловещее значение Undefined или DontCare) и кончая 0x0E.
Две следующих цифры справа указывают число бит на пиксел: 0x01, 0x04, 0x08, 0x10, 0x18, 0x20, 0x30 или 0x40. Другие цифры — это флаги. Ниже приведены значения перечисления PixelFormat, включая Мах, которое указывает количество форматов (вместе с Undefined — 15), а также значения, описывающие флаги.
Свойства класса Image (выборочно)
Член | Значение | Описание |
Мах | 0x0000000F | Количество форматов |
Indexed | 0x00010000 | Значения пикселов являются индексами в палитре |
Gdi | 0x00020000 | Формат Windows GDI |
Alpha | 0x00040000 | Содержит бит или байт прозрачности |
PAlpha | 0x00080000 | В значениях для цветов учтена прозрачность |
Extended | 0x00100000 | Использует больше 1 байта для каждой компоненты цвета или градации серого |
Canonical | 0x00200000 | Стандартный формат |
Класс Image также имеет статические методы, позволяющие извлечь большую часть этих сведений, не углубляясь в значения разрядов.
Статические методы класса Image (выборочно)
int GetPixelFormatSize(PixelFormat pf) |
bool IsAlphaPixelFormat(PixelFormat pf) |
bool IsCanonicalPixelFormat(PixelFormat pf) |
bool IsExtendedPixelFormat(PixelFormat pf) |
Первый метод возвращает число бит на пиксел.
Если изображение индексированное (что можно определить, выполнив поразрядное логическое умножение PixelFormat и PixelFormat.Indexed), у него имеется палитра цветов. Получить палитру поозволяет свойство Palette.
Свойства класса Image (выборочно)
Тип | Свойство | Доступ |
ColorPalette | Palette | Чтение/запись |
Довольно странное свойство. Как видно, оно доступно для чтения и записи. Однако сам класс ColorPalette (определенный в пространстве имен System.Drawing.Image) является изолированным (sealed). Это значит, что нельзя создать его подклассы и у него нет общедоступных конструкторов, т.е. нельзя создать его экземпляры. Таким образом, получить в .NET объект ColorPalette позволяет только данное свойство класса Image.
Сам класс ColorPalette обладает двумя неизменяемыми свойствами.
Свойства класса ColorPalette (выборочно)
Тип | Свойство | Доступ |
Color[] | Entries | Чтение |
int | Flags | Чтение |
Свойство Entries возвращает массив цветов, образующих палитру изображения.
Еще одно свойство класса Image указывает формат файла:
Свойства класса Image (выборочно)
Тип | Свойство | Доступ |
ImageFormat | RawFormat | Чтение |
Я уже упоминал класс ImageFormat. Он включает статические свойства для всех поддерживаемых форматов растровых изображений.
Свойство RawFormat класса Image довольно трудно применять. Его можно использовать только со свойством экземпляра (т.е. только с нестатическим свойством) класса ImageFormat, возвращающим глобальный уникальный идентификатор (globally unique identifier, GUID) объекта ImageFormat:
Свойство экземпляра ImageFormat
Тип | Свойство | Доступ |
Guid | Guid | Чтение |
Программа может только проверить, имеет ли конкретный объект Image определенный тип ImageFormat. Например, при наличии объекта Image с именем image, загруженного из JPEG-файла, выражение:
image.RawFormat.Guid == ImageFormat.Png.Guid
возвращает false, а:
image.RawFormat.Guid == ImageFormat.Jpeg.Guid
возвращает true. Выражение:
image.RawFormat.ToString()
возвращает строку:
[ImageFormat: b96b3cae-0728-11d3-9d7b-0000f81ef32e]
а выражение
ImageFormat.Jpeg.ToString()
возвращает строку:
Jpeg
Вот и решайте, что именно вывести пользователю!
Подробнее о других свойствах и методах класса Image мы поговорим в следующих разделах.
netlib.narod.ru | < Назад | Оглавление | Далее > |