§ 14. Интерактивная графика

14.3. Битовые образы

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

Сформировать битовый образ можно путем загрузки из bmp-файла или путем копирования фрагмента из другого битового образа, в том числе и с поверхности компонента Image.

В программе битовый образ — это объект типа TBitmap. Класс TBitmap, определен в CBuilder как Graphic::TBitmap. Этот класс поддерживает как растровые изображения в виде массива пикселей, так и изображения в формате BMP. Некоторые свойства и методы объекта TBitmap приведены в примере 14.4.

Описание битовой матрицы с именем Pict осуществляется следующим образом:

Graphics::TBitmap *Pict = new Graphics::TBitmap();

— указатель на место в памяти, где будет размещен объект, хранящий изображение.

Для вывода битового образа на канву можно воспользоваться методом Draw(x, y, Pict). Параметры x, y определяют местоположение верхнего левого угла изображения, хранящегося в переменной Pict (объект типа TBitmap).

Пример 14.5. Создать проект, в котором по клику мыши поверх фонового изображения леса необходимо нарисовать картинки зверей, хранящихся в файлах. Для корректной работы все рисунки должны быть в BMP формате. Рисунки следует сохранить в папке Win32\Debug. Рисунки, на которых изображены звери, должны иметь однородный фон[1].

Этапы выполнения задания

  1. Поместить на форму компонент Image.
  2. В событии OnCreat для формы загрузить фоновое изображение в компонент Image1. Изображение необходимо загружать в своих реальных размерах (свойство Scratch = false). В противном случае при клике по изображению координаты точки не будут соответствовать реальной картинке.
  3. Написать обработчик события OnMouseDown для компонента Image.

3.1. Создать объект Pict для хранения битового образа;
3.2. С помощью диалога OpenPictureDialog1 загрузить рисунок в память.
3.3. Установить прозрачный цвет для фона.
3.4. Вывести рисунок методом Draw.

Битовые образы могут использоваться для заливки фигур, нарисованных на канве. Для этого свойству Brush -> Bitmap нужно присвоить значение битового образа.

Image1->Canvas->Brush->Bitmap = Pict;

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

Если размеры битового образа меньше, чем область заливки, то область заливки замещается изображениями, которые хранятся в битовой матрице. Если область заливки меньше, то будет видна только часть изображения (пример 14.6).

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

Image1->Canvas->Brush->Bitmap = NULL;

[1] При необходимости рисунок нужно предварительно обработать в графическом редакторе.

Использование битовых образов позволяет рисовать на невидимых виртуальных поверхностях — в буквальном смысле в оперативной памяти. При выводе графической информации удается избежать эффекта мигания, который возникает при непосредственной модификации внешнего вида элементов управления на форме. Основное преимущество использования битовых образов — скорость обработки и вывода изображений.

Пример 14.4. Некоторые свойства объекта TBitmap.

Свойство

Назначение

Canvas

Определяет холст для изображения битового образа

Empty

Указывает, содержит ли объект битовый образ

Height

Высота изображения в пикселях

Transparent

Определяет, должно ли изображение быть «прозрачным»

TransparentColor

Определяет, какой из цветов будет прозрачным при рисовании битового образа

Width

Указывает ширину изображения в пикселах

Некоторые методы объекта TBitmap.

Метод Assign копирует изображение из другого графического объекта.

Методы LoadFromFile и SaveToFile используются для чтения изображение из файла и записи изображения в файл.

Пример 14.5. Форма на этапе конструирования:

Обработчик события OnCreat.

void __fastcall TForm1::FormCreate(TObject *Sender)

{

  Image1 ->Picture ->LoadFromFile("лес.bmp");

  OpenPictureDialog1 -> InitialDir =

  ExtractFilePath(ParamStr(0));

}

Обработчик события OnMouseDown

void __fastcall TForm1::Image1MouseDown
                TObject *Sender, 
                TMouseButton Button, 
                TShiftState Shift, 
int X, int Y)

{

  if (OpenPictureDialog1 ->Execute()){

    Graphics::TBitmap *Pict = 

    new Graphics::TBitmap();

    Pict ->LoadFromFile

    (OpenPictureDialog1 ->FileName);

    Pict ->Transparent = true;

    Pict ->TransparentColor =

    Pict ->Canvas ->Pixels[0][0];

    Image1 ->Canvas ->Draw(X, Y, Pict);

  }

}

Работающее приложение:

Пример 14.6. Заливка с использованием битовых образов:

Код обработчика нажатия кнопки «Эллипс» (для прямоугольника аналогично):

Graphics::TBitmap *Pict = 

  new Graphics::TBitmap();

Pict -> LoadFromFile("розы.bmp");

Image1 -> Canvas-> Brush -> Bitmap = Pict;

Image1 -> Canvas-> Ellipse(1010500350);

Image1 -> Canvas-> Brush -> Bitmap = NULL;

Константа NULL, имеет значение «ничего». Формально — это значение указателя, который не ссылается ни на какой объект.