Загрузка битового образа из файла



Заливка изображений

Класс Brush

 

Класс Brush (кисть) используется для заполнения внутренних областей изображаемых фигур. Класс Brush – это абстрактный класс. Для создания экземпляра класса Brush нужно использовать производные классы, такие как SolidBrush, TextureBrush и LinearGradientBrush. SolidBrush заполняет фигуру сплошным цветом. TextureBrush позволяет заполнять фигуру изображением, хранящемся в двоичном представлении. При создании такой кисти требуется также задавать обрамляющий прямоугольник и режим обрамления. Обрамляющий прямоугольник определяет, какая часть изображения должна использоваться при рисовании (использовать весь рисунок необязательно). Для режима обрамления существует несколько возможностей, например, Tile (черепица). LinearGradientBrush позволяет реализовать плавный переход от одного цвета к другому, причем первый цвет переходит во второй под определенным углом. Углы при этом задаются в градусах. Угол, равный 0°, означает, что переход от одного цвета к другому осуществляется слева направо. Угол, равный 90°, – что сверху вниз. Существует еще одна разновидность кисти – PathGradientBrush, позволяющая создавать сложный эффект затенения, при котором используется изменение цвета от середины рисуемого пути к его краям.

Подобно классу Pens, существует класс Brushes, в котором содержится приблизительно 150 разновидностей кистей – по одной на каждый заранее определённый цвет.

 

System.Drawing.Brush linearGradientBrush = new LinearGradientBrush(ClientRectangle,Color.Gray, Color.White, 45);

canvas.FillRectangle(linearGradientBrush, ClientRectangle);

canvas.FillRectangle(Brushes.Red, new Rectangle(10, 10, 50, 50));

canvas.FillEllipse(Brushes.Indigo, new Rectangle(50, 20, 50, 20));

canvas.FillPie(Brushes.Lavender, new Rectangle(50, 60, 100, 100), 90, 210);

canvas.FillPolygon(Brushes.OliveDrab, new Point[] {
new Point(70, 10), new Point(150, 10), new Point(160, 40),
new Point(120, 20), new Point(120, 60) } );

 

В примере следует обратить особое внимание на градиентную заливку всей поверхности формы, позволяющую придать ей достаточно нетривиальный внешний вид. При этом область, задаваемая при создании объекта linearGradientBrush, может и не совпадать с областью заливки (в методе FillRectangle()).

 

Вывод изображений

 

Базовую функциональность по работе с графическими изображениями в . NET инкапсулирует класс Image, который также находится в пространстве имён System.Drawing. Класс Image является абстрактным. У него существует два класса-наследника: Bitmap («битовая карта» – для работы с растровыми изображениями) и Metafile (для работы с векторными).

 

Использование битовых карт

 

Битовая карта – это прямоугольный массив битов, соответствующих пикселям на поверхность рисования. Битовая карта имеет определённую высоту и ширину, измеряемую в пикселях. Кроме того, она обладает определенной насыщенностью цвета (color depth), измеряемой числом битов на пиксель. Все пиксели битовой карты имеют одинаковое число бит, которое определяет количество уникальных цветов в изображении; число цветов = 2число бит на пиксель. Число бит на пиксель может составлять от 1 до 32 (и более).

В модели RGB каждый код основного цвета обычно равен 1 байту, а полный код цвета RGB – 3 байтам, т.е. 24 битам. Дополнительный байт может определять уровни прозрачности, начиная с полной непроницаемости и кончая полной прозрачностью. И всё же 32 бита на пиксель – это не верхний предел. Некоторые приложения, например, программы для работы с изображениями в медицине, требуют большего числа бит на пиксель для повышенного разрешения.

Битовая карта с разрядностью 1 бит на пиксель содержит двухуровневое, или монохромное, изображение. Такая битовая карта, как правило, включает небольшую таблицу (или палитру) цветов, указывающую два цвета, связанных с двумя значениями битов. На заре эпохи Windows были распространены изображения с разрядностью 4 бита на пиксель; их можно найти и сейчас. Например, значки зачастую являются 1б-цветными изображениями. Разрядность одного из самых распространенных форматов битовых карт – 8 бит на пиксель. Зачастую изображение представляется в градациях серого, и 8 бит соответствуют 256 или меньшему числу градаций серого, начинай черным и заканчивая белым. Цветные изображения также можно хранить в битовых картах с 8 битами на пиксель, тогда для изображения выбираются 256 или менее конкретных цветов.

В битовой карте с разрядностью 16 бит на пиксель обычно используется 5 бит для каждого из уровней красного, зеленого и синего; 1 бит остается незадействованным. Таким образом, код основного цвета может иметь 32 значения, что в целом даёт 32 768 уникальных цветов. Иногда зеленому цвету выделяют дополнительный бит, так как именно к этому цвету наиболее чувствителен глаз человека. Такие битовые карты иногда называют «5-6-5, указывая число бит для каждого из основных цветов. Разрядность в 15 или 16 бит на пиксель обычно называется средним качеством цветопередачи (high color) и недостаточна для представления градаций цвета на реалистичных изображениях. Разрядность полноцветной (full - color, true - color) битовой карты – 24 бита на пиксель.

В . NET для работы с битовыми картами предназначен класс Bitmap.

Основные свойства (табл. 3) и методы (табл. 4) класса Bitmap представлены ниже.

 

Таблица 3. Основные свойства класса Bitmap

Свойство Тип Описание
Height System.Int32 Получает высоту объекта Bitmap в точках
HorizontalResolution System.Single Получает горизонтальное разрешение объекта Bitmap в точках на дюйм
PhysicalDimension System.Drawing.SizeF Получает ширину и высоту данного изображения
RawFormat System.Drawing . Imaging.BitmapFormat Получает графический формат объекта Bitmap
Size System.Drawing.Size Получает ширину и высоту данного изображения в точках
VerticalResolution System.Single Получает вертикальное разрешение объекта Bitmap в точках на дюйм
Width System.Int32 Получает ширину объекта Bitmap в точках

 

Таблица 4. Основные методы класса Bitmap

Метод Описание
Clone() Создаёт точную копию данного объекта Bitmap
FromFile() Создаёт объект Bitmap из указанного файла
FromResource() Создаёт изображение Bitmap из указанного ресурса Windows
GetBounds() Получает границы изображения в заданных единицах измерения
GetPixel() Получает цвет указанной точки в изображении
GetPixelFormatSize() Возвращает глубину цвета (число бит на точку) указанного формата точек
GetThumbnailBitmap() Возвращает эскиз для объекта Bitmap
IsAlphaPixelFormat() Возвращает значение, указывающее, содержит ли формат точек данного объекта Bitmap данные альфа-канала
IsCanonicalPixelFormat() Возвращает значение, определяющее, приходится ли в формате точек 32 разряда на точку
IsExtendedPixelFormat() Возвращает значение, определяющее, приходится ли в формате точек 64 разряда на точку
MakeTransparent() Делает стандартный или указанный цвет прозрачным для данного изображения Bitmap
RotateFlip() Данный метод либо поворачивает, зеркально отражает, либо поворачивает и зеркально отражает объект Bitmap
Save() Сохраняет данное изображение в указанный поток в указанном формате
SetPixel() Задает цвет указанной точки в объекте Bitmap
SetResolution() Устанавливает разрешение для объекта Bitmap

 

Существует несколько источников получения растрового изображения: его можно загрузить из файла; оно может поступить из открытого потока; оно может быть создано из уже существующего образа; оно может быть создано как пустой образ, в котором потом будет осуществляться рисование.

Загрузка битового образа из файла

 

Если образ считывается из файла, то такой файл должен быть представлен в форматах JPEG, GIF или BMP. Например:

 

Bitmap bitmap = new Bitmap("C:\\Windows\\Ночной ковыль.bmp"); canvas.DrawImage(bitmap, 30, 30);

 

На основе получаемого битового образа можно создать объект TextureBrush и с его помощью выполнить заливку графической фигуры:

 

Bitmap nightBitmap = new Bitmap("C:\\Windows\\Ночной ковыль.bmp");
... ... ...

Bitmap smallNightBitmap = new Bitmap(nightBitmap,
new Size(nightBitmap.Width / 10, nightBitmap.Height / 10));

Brush tBrush = new TextureBrush(smallNightBitmap,
new Rectangle(0, 0, smallNightBitmap.Width, smallNightBitmap.Height));

canvas.FillEllipse(tBrush, ClientRectangle);

Pen tPen = new Pen(tBrush, 12);

canvas.DrawRectangle(tPen, ClientRectangle);

Font timesFont = new Font ("Times New Roman", 32, FontStyle.Bold | FontStyle.Italic);

Bitmap fishBitmap = new Bitmap("C:\\Windows\\На рыбалку.bmp");

Brush fishBrush = new TextureBrush(fishBitmap);

canvas.DrawString("Строка с текстурой", timesFont, fishBrush, ClientRectangle);

 

Из образа bitmap был создан образ smallBitmap. В конструктор, кроме самого исходного образа, был передан прямоугольник, размеры которого составляют одну десятую часть от размеров объекта bitmap. Того же (и даже более гибкого) эффекта можно добиться при создании класса TextureBrush, указывая в конструкторе прямоугольник, с помощью которого определяется, какая именно часть образа будет использоваться для создания кисти. В примере задано использование всего образа целиком. В заключение осуществляется вывод эллипса и прямоугольника с использованием полученной текстурной кисти. Кроме того, на основе нового образа fishBitmap выводится строка, также заполненная текстурой.


Дата добавления: 2019-03-09; просмотров: 228; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!