§ 14. Інтэрактыўная графіка

14.3. Бітавыя вобразы

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

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

У праграме бітавы вобраз — гэта аб'ект тыпу TBitmap. Клас TBitmap, вызначаны ў CBuilder як Graphic:: TBitmap. Гэты клас падтрымлівае як растравыя малюнкі ў выглядзе масіва пікселяў, так і малюнкі ў фармаце BMP. Некаторыя ўласцівасці і метады аб'екта TBitmap прыведзены ў прыкладзе 14.4.

Апісанне бітавай матрыцы з імем Pict здзяйсняецца наступным чынам:

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

— паказальнік на месца ў памяці, дзе будзе размешчаны аб'ект, які захоўвае малюнак.

Для вываду бітавага вобраза на канву можна скарыстацца метадам Draw (х, 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, мае значэнне «ничего». Фармальна — гэта значэнне паказальніка, які не спасылаецца ні на які аб'ект.