Язык программирования Delphi Работа с графикой, прозрачные картинки:
Мы продолжаем изучение программирования графики на Delphi. Сегодня у нас будет маленький примерчик, но очень удаленький. Прозрачность картинки очень часто обсуждается на различных конференциях, поэтому я решил объяснить эту проблему всем.
Как всегда, нам понадобиться запустить Delphi и создать новый проект. Теперь поставь на форму из палитры компонентов Additional компонент TImage . Теперь дважды щёлкни по его свойству Picture . Перед тобой появиться стандартный диалог выбора файла, выбери любой bmp файл, и нажимай "ОК". У тебя должно получиться нечто похожее на рисунок 1.
Рис 1. Форма
Теперь щёлкни по форме и создай для неё обработчик события OnPaint . Это событие отвечает за прорисовку экрана, и вызывается каждый раз когда окно нуждается в прорисовке. Вспомни пример из прошлого номера, в котором мы рисовали поворачивающийся текст, программа работает прекрасно, но как только мы свернём её и восстановим заново, всё исчезнет. Мы должны сами восстанавливать содержимое экрана, и делать это надо именно в обработчике OnPaint . Поэтому этот пример мы сделаем по всем правилам.
В созданной процедуре FormPaint напиши следующее:
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Brush.Color:=Color;
Canvas.BrushCopy(Rect(0,0,Image1.Width,Image1.Height),
Image1.Picture.Bitmap,
Rect(0,0,Image1.Width,Image1.Height),
Image1.Picture.Bitmap.Canvas.Pixels[1,1]);
end;
Рис 2. Результат работы программы
Теперь можешь запустить программу и посмотреть результат. Неплохо? Давай рассмотрим, что же мы писали, чтобы добиться этого.
Canvas.Brush.Color:=Color; Как ты уже знаешь, Canvas отвечает за то, что будет нарисовано в окне. Поэтому, чтобы что-то нарисовать прямо на форме, мы рисуем это здесь. У него есть свойство Brush, в котором хранятся параметры кисти, используемой при закрашивании. Мы изменяем только один параметр у этой кисти - цвет, которому мы присваиваем цвет формы. Взглянём на эту запись вот так: Область_рисования_формы.Кисть.Цвет:=Цвет_формы.
Теперь перейдём ко второй строке. Она кажется немного сложной, но это только на первый взгляд. Поэтому рассмотрим всё по частям. М используем процедуру BrushCopy у уже знакомого Canvas . Эта процедура копирует на Canvas картинку.
procedure BrushCopy(
const Dest: TRect; // Область приёмника
Bitmap: TBitmap; // Картинка которая будет копироваться
const Source: TRect; // Область источника
Color: TColor); // Прозрачный цвет
Область приёмника объявлена как TRect, который имеет вид TRect = (Left, Top, Right, Bottom: Integer); . Что находиться в скобках, я думаю пояснять не надо. То же самое и с областью источника. В качестве картинки мы передаём Bitmap из TImage . Прозрачный цвет будет заменяться на цвет кисти, который мы задали в первой строке.
В качестве прозрачного цвета я использовал цвет пикселя в позиции [1,1] из картинки TImage. На это указывает запись Image1.Picture.Bitmap.Canvas.Pixels[1,1] . Я её запишу немного по другому: TImage1.Его_картинка.Bitmap.Область_рисования.Пиксел[1_по_оси_X, 1_по оси_Y]