Что такое Битмапы (Bitmaps)?
Рисование линий, это, конечно, хорошо, но рано или поздно Вам понадобится нарисовать более реалистичную картнику в своём приложении. Поэтому совершенно необходимо научиться работать с растровыми изображениями, или как их называют в среде программистов - битмапами.
Битмап, это графический объект, который содержит заголовок, необходимую информацию о картинке (такую как высота, ширина, цвета и т.д.) и, собственно, само изображение (большой массив, содержащий цвет каждой точки). В Delphi для этой цели уже предусмотрен класс TBitmap.
Битмапы можно рисовать не только на форме, но и по всему экрану. Может это и может показаться немного странным, но иногда это бывает полезно, особенно при создании скринсейвера. Однако, сначала нам необходимо разобраться с тем, как работать с битмапами. Вот небольшой пример:
procedure Form1.DrawBitmap(const Filename: String; const x,y: Integer);
var
Bmp: TBitmap;
begin
// Сперва убедимся, что файл существует!
if not FileExists(Filename) then
begin
ShowMessage('The bitmap ' + Filename + ' was not found!');
Exit;
end;
Bmp := TBitmap.Create;
try
Bmp.LoadFromFile(Filename);
Canvas.Draw(x, y, Bmp);
finally
Bmp.Free;
end;
end;
Эта функция пытается загрузить и показать картинку, (с именем Filename, например 'myBitmap.bmp') начиная с точки (x,y).
Сразу скажу, что эта функция довольно неэффективна. Она создаёт и уничтожает битмап каждый раз когда вызывается, а так же каждый раз проверяет существование файла. Лучше объявлять объект TBitmap как часть формы, создавать и загружать картинку в FormCreate, а освобождать её в FormDestroy.
Функции рисования в gdi
TCanvas имеет несколько полезных функций, которые работают с типом TGraphic. Тип TGraphic является базовым классом для графических объектов в Delphi, таких как: битмапы (TBitmap), иконки (TIcon), метафайлы (TMetafile) и JPEG-и (TJPEGImage). Все они используют одни и те же функции, которые приведены в таблице:
Все эти функции являются методами TCanvas.
ИМЯ |
ОПИСАНИЕ |
ПРИМЕР |
Draw |
Рисует TGraphic на канвасе так как он есть, не растягивая. |
Canvas.Draw(5,10,MyGraphic); |
StrechDraw |
Рисует TGraphic на канвасе, подгоняя (растягивая) его под заданную область. |
Canvas.StretchDraw( Bounds(0,0,32,32), MyGraphic); |
CopyRect |
Копирует часть TCanvas-а в другой, при необходимости растягивая его. |
Canvas.CopyRect( Bounds(0,0,32,32), MyBmp.Canvas, Bounds(0, 0, 640, 480)); |
TCanvas.Draw является обёрткой для API функции BitBlt:
function BitBlt(
hdcDest: HDC; // дескриптор конечного контекста устройства
nXDest, // коорд. x верхнего левого угла конечного прямоугольника
nYDest, // коорд. y верхнего левого угла конечного прямоугольника
nWidth, // ширина конечного прямоугольника
nHeight: Integer; // высота конечного прямоугольника
hdcSrc: HDC; // дескриптор исходного контекста устройства
nXSrc, // коорд. x верхнего левого угла исходного прямоугольника
nYSrc: Integer; // коорд. y верхнего левого угла исходного прямоугольника
dwRop: DWORD // код растровой операции
): Boolean;
Описанный выше способ позволяет рисовать битмап в run-time. Конечно, проще поместить на форму TImage и установить в ней картинку. Изображение будет постоянно оставаться на том месте, где Вы его поместили, но это скучно ;-). Куда интереснее сделать при помощи битмапов анимацию.
С другой стороны, поняв принципы работы с битмапами, Вам будет легче перейти к другим графическим библиотекам (например DirectX).