Класс TBitmap является основой растровой графики в Delphi, он
определяет класс изображений или битовых карт, где изображение
задается цветами всех своих пикселей. Это единственный стандартный
класс, который позволяет редактировать свое изображение: в про-
грамме – канва битовой карты доступна через свойство Canvas (другие
потомки TGraphic канвы не имеют). Основные свойства класса TBitmap
приведены в табл. 1.7.
Таблица 1.7. Некоторые свойства класса TBitmap
Пример. В Bitmap’e пиксели определенного цвета сделаем про-
зрачными, вместо них будет показываться цвет фона формы:
//Установка свойства прозрачности
Bitmap.Transparent:=true;
//Установка цвета левого верхнего
//пиксела в качестве прозрачного
Bitmap.TransparentMode:=tmAuto;
Form1.Canvas.Draw(0, 0, Bitmap);
//Установка конкретного прозрачного цвета (красного)
Bitmap.TransparentMode:=tmFixed;
Bitmap.TransparentColor:=RGB(255, 0, 0);
Form1.Canvas.Draw(20, 0, Bitmap);
Для первой картинки прозрачный цвет - это цвет левого верхнего
пикселя, для второй - красный цвет.
Пример. Сделаем некоторое изображение монохромным:
procedure TForm1.Button3Click(Sender: TObject);
begin
Image1.Picture.Bitmap.Monochrome:= true;
end;
Битовая карта является одним из видов ресурсов. Поэтому класс
TBitmap поддерживает загрузку из ресурсов приложения с помощью
методов:
procedure LoadFromResourcelD(Instance: THandle;
ResID: Integer);
procedure LoadFromResourceName(Instance: THandle;
const ResName: string);
В методе LoadFromResourceName параметр Instance — это гло-
бальная переменная модуля System, хранящая уникальный идентифи-
катор запущенной копии приложения (или динамической библиотеки),
а ResName – имя (идентификатор) ресурса, заданное во время создания
ресурса. Например, инструкция:
BitMap1.LoadFromResourceName(HInstance, 'WATER');
загружает в битовый образ BitMap1 картинку из ресурса WATER.
В состав Windows входят карточные игры (пасьянсы), которые
черпают ресурсы из динамической библиотеки cards.dll
(C:/WINDOWS/System32). В этой библиотеке содержаться изображения
всех пятидесяти двух карт и несколько вариантов их рубашек. Исполь-
зуем эту возможность для рисования карт. Рассмотрим пример, позво-
ляющий загрузить в компонент Image1 при нажатии на кнопку бито-
вую карту для рубашки:
var
Form1: TForm1;
CardsDll: THandle;
BackBitmap: Graphics.TBitmap;
implementation
{$R *.dfm}
//создание формы
procedure TForm1.FormCreate(Sender: TObject);
begin
CardsDll := LoadLibraryEx('cards.dll', 0,
LOAD_LIBRARY_AS_DATAFILE);
BackBitmap := Graphics.TBitmap.Create;
BackBitmap.LoadFromResourceID(CardsDll, 54)
end;
//щелчок на кнопке
procedure TForm1.Button1Click(Sender: TObject);
begin
Image1.Picture.Bitmap:=BackBitmap
end;
//закрытие формы
procedure TForm1.FormClose(Sender: TObject; var Action:
TCloseAction);
begin
BackBitmap.Free;
FreeLibrary(CardsDll);
end;
Просмотр всех картинок из этой библиотеки можно организовать,
воспользовавшись, например, компонентом таймер: с каждым тиком
таймера увеличиваем номер просматриваемой картинки (от 1 до 65).
Часто при работе с битовыми картами требуется присвоить одну
битовую графику другой. Для этого можно использовать виртуальный
метод Assign определенный в классе Persistent. Синтаксис метода:
procedure Assign(Source: TPersistent);
Пример вызова метода: BitMap.Assign(JpegImage)
Этот важнейший метод осуществляет копирование содержимого
одного объекта (Source) в другой объект TBitmap (Self, т. е. в объект,
вызвавший метод Assign). При этом объект-получатель остается са-
мим собой, чего нельзя достигнуть, используя простое присваивание
переменных объектного типа. Если параметр Source не является бито-
вым изображением, то Assign вызывает унаследованный метод
Assign, который может скопировать изображение из любого класса,
обладающего функциональностью копирования в объект TBitmap. Ес-
ли в битовое изображение должны быть внесены какие-либо измене-
ния, то реальное изображение копируется до применения изменений.
Пример. Пусть необходимо добавить изменения в некоторое изо-
бражение, загружаемое из графического файла в компонент Image.
Тогда возникает проблема при «рисовании» на канве Imag’a, если в
него было загружено изображение из файла формата .jpg. Для решения
проблемы, необходимо при открытии файла формата .jpg преобразо-
вать его графику в объект TBitmap. Пусть используется фильтр диало-
га OpenPictureDialog1:
Bitmaps (*.bmp)|*.bmp|
JPEG Image File (*.jpg)|*.jpg
Тогда преобразование графики можно выполнить процедурой:
var
BitMap: TBitmap;
// процедура открытия файла изображения
procedure TForm1.OpenFile;
var
JpegImage: TJPEGImage;
begin
if OpenPictureDialog1.Execute
then
begin
BitMap:= TBitMap.Create;
JPegImage := TJpegImage.Create;
if (OpenPictureDialog1.FilterIndex = 2)
then
begin
JpegImage.LoadFromFile(OpenPictureDialog1.FileName);
BitMap.Assign(JpegImage);
end
else
BitMap.LoadFromFile(OpenPictureDialog1.FileName);
Image1.Canvas.StretchDraw(Rect(0, 0, Image1.Width,
Image1.Height), BitMap);
end;
end;
После применения этой процедуры при открытии файла любого из
двух указанных форматов (.bmp или .jpg), изображение преобразуется
в битовое. Следовательно, на поверхности Image1 можно «рисовать».
|