Меню

Как задать цвет image c



Работа с графикой и рисунками средствами Borland C++ Builder

Основные понятия

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

Графика. Это растровое изображение некоторого файла или ресурса (битового образа, пиктограммы или метафайла). C++Builder определяет производные от базового класса TGraphic объектные классы TBitmap, Ticon и TMetafile, предназначенные для работы с графикой.
Класс TBitmap, определен в Borland C++ Builder как Graphic::TBitmap, имеет свойства и методы, позволяющие создавать графические изображенеия, управлять их атрибутами, читать в память и сохранять как файлы DIB на диске. Graphic::TBitmap поддерживает как растровые графические изображения в виде массива пикселей, так и изображения в формате .bmp. Основное свойство класса — Canvas. Класс TGraphic предоставляет TBitmap минимальный стандартный интерфейс для работой с графикой.
Классы TIcon и TMetafile также являются производными от базового класса TGraphic и имеют свойства и методы для работы с графикой, но в отличии от TBitmap не имеют свойства Canvas, что объясняется спецификой построения и использования изображений в формате *.ico и *.wmf (*.emf).

Рисунок представляет собой контейнер для графики, т.е. он может содержать любые классы графических объектов. Контейнерный класс TPicture может содержать битовый образ, пиктограмму, метафайл или некоторый другой графический тип, определенный пользователем, а приложение может стандартизовано обращаться ко всем объектам контейнера посредством объекта «рисунок». Класс TPicture инкапсулирован в класс TImage и визуальный компонент TImage, как их основной компонент и имеет возможность работы с иконоками, bmp-файлами и метафайлами. При некоторых дополнениях возможна работа с файлами других форматов (*.jpeg, *.jpg, *.gif).

Рассмотрение вопросов темы будем вести на примерах, в которых последовательно показывается использование основных свойств и методов классов. Работа с ресурсами выделена в отдельный раздел (см. Работа с ресурсами в Borland C++ Builder).

Классы TBitmap, TIcon и TMetafile

В данном параграфе рассматривается использование не инкапсулированных в другие классы и компоненты Borland C++ Builder классов TBitmap, TIcon и TMetafile.

Загрузка и сохранение графики

Первый пример показывает создание объектов соответствующих классов, загрузку в них файлов и сохранение файлов:

Загрузка и отрисовка графики

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

Параметры всех функций либо нам уже известны, либо прозрачны и не требуют пояснений. Результаты работы кода показаны на рисунке.

Рис 1. Использование класса TBitmap

Полностью аналогичен код и для графики в форматах .ico и .emf:

Для отрисовки графики можно использовать функцию StretchDraw(), которая, в отличие от функция Draw() не только рисует, но и масштабирует изображение. Однако, иконки не масштабируются — им только выделяется указанный в функции кусок канвы

Метод CopyRect() также предназначен для отрисовки графики и переносит указанную область изображения или его часть в канве источника изображения в указанную область изображения данного объекта TCanvas. Копирование производится в режиме, установленном свойством CopyMode канвы, разноообразие которых можно посмотреть в Help Borland C++ Builder.

Модификация графики

Следущий пример показывает как можно создать объект TBitmap, выполнить на нем рисунок и перенести на канву приложения. К сожалению это нельзя сделать не для иконок, не для метафайлов, у которых нет сваойства Canvas.

Читайте также:  С каким цветом сочетается бирюзовая кофта

Нижепреведенный код объединяет два примера, а именно на графическом изображении, полученном из файла выполняется некоторая отрисовка и новое изображение переносится на канву приложения. Результат — прямоугольник с закругленными краями желтого цвета заменяется на круг.

Установка прозрачности

Bitmap может иметь один цвет, как прозрачный, тоесть цвет, который при выводе заменяется на цвет фона канвы отображения, не зависимо от смены ее цвета. Сделать это можно двумя способами. При первом способе определяется как «прозрачный» цвет левого верхнего пиксела Bitmap. При втором способе определяется прозрачным какой либо конкретный цвет. Установка того или иного способа определения прозрачных пикселов задается свойством TransparentMode (возможные значения для него — tmAuto и tmFixed соответственно). И в том, и в другом случае надо установить свойство Transparent для Bitmap в true.

Захват изображений с экрана монитора

В примере, описанном ниже, показано использование классов TCanvas и TBitmap для получения изображения с экрана монитора и сохранения его в файле. функция vPurloin() в зависимости от параметра, переданного ей, получает снимок экрана, окна приложения или клиентской части окна приложения (окна без заголовка) и сохраняет их в файл на диске. В принципе, этот пример использует и функции GDI для получение контекстов устройств и, в частности, экрана монитора, но основа, всеже, использование класса TBitmap.

Использование буфера обмена для работы с графикой

Использование метода Assign позволяет проводить обмен данными между совершенно разнородными компонентами, например, компонентом буфера обмена TClipboard и графическим объектом TBitmap. Отметим, что следущий пример может быть повторен для метафайлов и не подходит для иконок, так как буфер обмена не поддерживает формат .ico. О том, как все же можно поместить в буфер обмена иконку (см. Работа с ресурсами в Borland C++ Builder).

Записать изображение в буфер можно оператором:

Прочитать изображение из буфера изображение оператором:

Следующий пример деманстрирует возможности этих операторов:

Другой, но мало привлекательный метод работы с буфером обмена — SaveToClipboardFormat(). Он создает копию изображения в формате Clipboard — формат, указатель на данные и палитру, возвращаются как параметры функции. Стандартно зарегистрированные форматы: CF_BITMAP для битовых карт и CF_METAFILEPICT для метафайлов. Формат для нового типа графического объекта предварительно должен быть зарегистрирован методом RegisterClipboardFormat().

После применения метода SaveToClipboardFormat() надо передать объекту Clipboard полученные значения параметров.

Пример использования метода SaveToClipboardFormat():

Экономия ресурсов

В этом примере показано освобождение ресурсов изображения на различных уровнях (методы Dormant(), FreeImage(), ReleaseHandle()), кроме того в примере показано как преобразовать изображение в монохромное (свойство Monochrome):

Аналогично можно использовать для освобождения ресурсов для графики в формате .ico и .emf.

Другие методы и свойства TBitmap, TIcon, TMetafile

Из интересных свойств отметим:

gBitmap->Handle, gBitmap->Palette — дескрипторы битовой карты и ее палитры.

HandleAllocated() — проверяет наличие дескриптора компонента у данного элемента. Если дескриптор имеется, то возвращается true. В отличии от проверки свойства Handle, этот метод не приводит к созданию дескриптора при его отсутствии.

ReleaseHandle() и ReleasePalette() — возвращают (обнуляет) дескриптор изображения и палитры соответственно. Следует отметить, что один объект может иметь несколько дескрипторов. При любом внешнем обращении к дескриптору битовой карты и попытке рисовать на ее канве объект получает собственную копию содержимого дескриптора (тоесть совместного использования дескрипторов нет).

Читайте также:  Как самостоятельно сделать кашпо для цветов

ReleaseMaskHandle() — освобождает дескриптор маски точечного рисунка. Действие аналогично ReleasePalette.

Mask() — конвертирует текущее растровое изображение в одноцветную маску, заменяя TransparentColor белым цветом, остальные черным. Используется когда надо превратить битовую карту в маску для других битовых карт. Для преобразования могут использоваться свойства MaskHandle, и метод ReleaseMaskHandle().

Свойство HandleType — может принимать значения bmDIB или bmDDB и позволяет проверить тип изображение (DDB или DIB).

Свойство PixelFormat — позволяет определить и изменить формат изображения. Возможные значения — pfDevice, pf1bit, pf4bit, pf8bit, pf15bit, pf16bit, pf24bit, pf32bit, pfCustom. Режим pfDevice соответствует битовой карте DDB. Глубина цвета в 1, 4 и 8 бит на пиксел предусматривает наличие у изображения палитры. Другие режимы хранят значения яркостей точек в каждом из трех основных цветов — красном (R), зеленом (G) и синем (В). Разрядность 15 бит соответствует распределению бит 5-5-5 (RGB555), 16 бит — RGB 565, 24 бит — RGB888. Режим 32 бит похож на 24-битный, но в нем дополнительно добавлен четвертый канал (альфа-канал), содержащий дополнительную информацию о прозрачности каждой точки. Режим pfCustom предназначен для реализации программистом собственных графических конструкций (использовать его целесообразно только в собственных потомках TBitmap).

Простейший пример предбразования:

IgnorePalette — требование игнолировать палитру при значении true, увеличивает скорость работы с изображением, но ведет к потери качества для изображений особенно 16 и 256 цветов.

ScanLine[] — обеспечивает индексированный доступ к строкам пикселов растрового изображения. Метод используется только с форматами растрового изображения DIB.

Внутри строки данные упорядочены в соответствии с форматом (pixelFormat). Для формата pf1bit каждый бит в строке соответствует одному пикселу, для форматов до pf24bit пикселу соответствуют два байта, pf24bit — три байта (по байту на канал), pf32bit — четыре байта.

Более подробно об использовании метода ScanLine[] в параграфе посвященном повороту изображений далее в этом разделе.

Класс TImage и работа с изображениями

Визуальный компонент TImage создает на форме контейнер графического изображения (битового образа, пиктограммы или метафайла).

Большинство свойств компонента TImage такиеже как и у многих других компонент (положение изобрыжения на форме, его размеры, помощь, отображение подсказок и т.п.). Среди «не стандартных» свойств, отметим:

Picture. Контейнер графики. Окно загрузки файлов изображений открывается кнопкой в графе свойства Picture компонента TImage. Кроме того это свойство имеет методы LoadFromFile(), SaveToFile().

AutoSize. Чтобы контейнер изменил свои размеры так, чтобы вместить изображение целиком, устанавливается значение true свойства AutoSize.

Stretch. Чтобы исходное изображение растянулось на весь контейнер, задается значение true свойства Stretch.

Center — если AutoSize=false, то изображение помещается в центре компонента.

IncrementalDisplay — если true, то при загрузке больших файлов они будут показываться по частям по мере загрузки.

Transparent — считает цвет одного из угловых пикселей цветом прозрачности (левый нижний).

Отметим, что класс TImage может создаваться и как невизуальный компонент и использовать теже свойства и методы, что и визуальный компонент. и оба они могут использовать канву:

Рассмотрение вопросов параграфа темы будем вести на примерах, в которых последовательно показывается использование основных свойств и методов компонента и класса TImage. Работа с ресурсами выделена в отдельный раздел (см. Работа с ресурсами в Borland C++ Builder) и здесь опущена.

Кроме того, так как эти классы инкапсулируют в свойстве TPicture классы TBitmap, TIcon и TMetafile, то все, что относится непосредственно к работе с этими классами, более подробно можно посмотреть в предыдущем параграфе. Здесь же основное внимание уделено технологии работе с классами.

Читайте также:  Как можно затонировать русый цвет волос

Загрузка и сохранение графики

Методы LoadFromFile() и SaveToFile() объектного свойства Picture служат для динамической загрузки и сохранения файлов изображений с помощью инструкций типа, которые могут быть использованы двояко:

Загрузка и отрисовка графики

Отрисовка графики при использовании визуального компонента предельно проста — изображение отображается сразу при загрузке в компонент. При этом можно управлять многими параметрами изображений, например:

Для отображения графики, загруженной в созданный класс TImage, можно как и ранее воспользоваться функциями Draw() и StretchDraw():

Отметим, что масштабирования Bitmap в классе не предусмотрено и это возможно только при отрисовки, например функцией StretchDraw():

Для метафайлов и иконок примеры аналогичены, за некоторыми особенностями, которые хорошо видны из следующих примеров:

Отметим, что класс поддерживает масштабирование для метафайлов.

И для визуальных компонентов:

Обратим внимание на некоторое различие на задание размеров отображаемого рисунка. Такая конструкция не сработает для TImage:

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

Аналогично и для класса TImage:

Метод CopyRect() также предназначен для отрисовки изображений, переносит указанную область изображения или его часть в канве источника изображения в указанную область данного объекта TCanvas. Копирование производится в режиме, установленном свойством CopyMode канвы, разноообразие которых можно посмотреть в Help Borland C++ Builder.

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

Этот метод позволяет и увеличить размер изображения иконки как показано в следующем примере:

Модификация графики

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

Для визуального компонента:

Аналогично для класса:

Установка прозрачности

Все сказанное выше равным образом относится и для Timage, поэтому останавливаться на этом не будем. В примерах параграфа «Загрузка и отрисовка изображений» уже использовалось свойство Transparent для TImage. Отметим, что для иконок, если они созданы (например в Tools/Image Editor) как имеющие области прозрачности, установка свойства Transparent в false не поможет.

Пример установки прозрачности для класса TImage:

Тоже для визуального компонента:

Захват изображений с экрана монитора

Самый простой способ получить изображение экрана монитора это присвоить Handle канвы TImage Handle экрана или окна приложения:

Недостаток этого способа в том, что снимки нельзя масштабировать. Поэтому при необходимости масштабирования можно применить подход описанный для TBitmap, что для TImage выглядит так:

Для того, чтобы получить снимок окна приложения в код внесем изменения:

Использование буфера обмена для работы с графикой

Использование буфера обмена для работы с изображением для TImage также ничем не отличается от описанных выше способов для TBitmap, где отмечены и особенности использование методов для различных графических объектов. Поэтому в данном параграфе приведены лишь примеры.

Записать изображение в буфер и прочитать его можно операторами:

И пример, использования функции SaveToClipboardFormat(), описание которой приводилось ранее:

Экономия ресурсов

Этот пример полностью аналогичен, примеру для класса TBitmap:

Аналогично можно использовать для освобождение ресурсов для графики в формате .ico и .emf.

Источник