Все изображения можно разделить на две группы: растровые и векторные.
Растровые изображения представляют собой двумерный массив точек, для каждой из которых независимо может быть задан свой цвет, как показано на следующем рисунке:
Например, экран монитора представляется как растровое изображение.
Достоинства: возможность представлять изображения любой сложности, например фотореалистичные.
Недостатки: для изображений с большим количеством цветов и большим разрешением требуется большой объем памяти, причем занимаемый объем памяти растет квадратично при росте разрешения; плохие возможности масштабирования, так как, например, при увеличении изображения будет увеличиваться только размер точек, что приведет к значительному ухудшению качества.
В Windows стандартный формат представления растровых изображений – битовые карты (Bitmap), хранящиеся в файлах с расширением BMP.
Векторные изображения формируются из геометрических примитивов (отрезков, окружностей, эллипсов и т.д.), например:
Достоинства: малый объем занимаемой памяти, возможность масштабирования.
Недостатки: возможность представлять только достаточно простые изображения, в связи с чем используются для представления схем, чертежей, деловой графики и т.д.
Стандартный формат хранения векторных изображений в Windows – так называемые метафайлы (Metafile) с расширением WMF.
10.3. Класс TPicture
Для представления изображений в Delphi используется класс
TPicture. Этот класс содержит три основных свойства, каждое из которых представляет определенный тип изображения (соответственно, актуальным может быть только одно из них):
Свойство
| Значение
|
Bitmap
| Значение класса TBitmap, представляющее растровое изображение
|
Metafile
| Векторное изображение (метафайл, класс TMetafile)
|
Icon
| Значок, или иконка (класс TIcon) – небольшое специальное растровое изображение, содержащее пиктограмму, задающую, например, тип документа. Иконки хранятся в фалах с расширением ICO
|
В дальнейшем будем рассматривать только растровые изображения.
10.4. Класс TBitmap
Класс TBitmap используется в Delphi для представления растровых изображений, содержит свойства, приведенные в следующей таблице.
Свойство
| Значение
|
Width и Height
| Ширина и высота изображения в точках. Если размеры изображения превышают размеры области, задаваемой элементом TImage, выходящая за пределы этой области часть изображения отсекается
|
Canvas
| Значение класса TCanvas, предоставляющего средства для рисования на задаваемом классом TBitmap растровом изображении
|
Если никакого изображения не загружено, растровое изображение, представляемое классом TBitmap, является пустым, т.е. его ширина и высота равны 0. Поэтому, для отображения графической информации необходимо сначала задать размеры изображения, содержащегося в элементе TImage. Например, эти размеры можно сделать равными размерам самого элемента TImage, в результате чего для рисования можно будет использовать всю занимаемую этим элементом на форме область.
Для иллюстрации основных свойств классов TImage, TPicture и TBitmap рассмотрим следующий пример формы, содержащей элемент «Изображение» и кнопку:
Процедура обработки события от нажатия кнопки Button1 задает размеры растрового изображения, содержащегося в элементе Image1, равными размерам этого элемента.
Пример
PROCEDURE TForm1.Button1Click(Sender:TObject);
BEGIN
Image1.Picture.Bitmap.Width:=Image1.Width;
Image1.Picture.Bitmap.Height:=Image1.Height;
END;
Уже из приведенного примера видно, что обращаться к свойствам глубоко вложенных друг в друга классов крайне неудобно. В языке Паскаль в таких случаях можно применять описанный далее оператор.
10.5. Оператор WITH
Синтаксис
WITH <Структурная переменная> DO <Оператор>
Оператор WITH применяется для упрощения доступа к свойствам структурных переменных (типа «запись», «объект» или «класс»). Действие оператора можно продемонстрировать, переписав соответствующим образом тело процедуры, приведенной в предыдущем примере.
Пример
WITH Image1.Picture.Bitmap DO
BEGIN
Width:=Image1.Width;
Height:=Image1.Height;
END;
10.6. Класс TCanvas
Класс TCanvas предоставляет средства для рисования на различных типах изображений, например на растровых изображениях, представляемых классом TBitmap. Основные используемые для рисования процедуры класса TCanvas приведены в следующей таблице.
Процедура
| Описание
|
Rectangle(x1,y1,x2,y2)
| Рисование прямоугольника, левый верхний угол которого задается точкой (x1,y1), а правый нижний точкой (x2,y2). При этом внутренняя часть прямоугольника заполняется текущим цветом фона. На растровом изображении рисование прямоугольника происходит следующим образом:
При этом в прямоугольник не включаются самая правая и самая нижняя границы.
|
MoveTo(x,y)
| Перемещение текущей позиции в точку (x,y)
|
LineTo(x,y)
| Рисование линии из текущей позиции до точки (x,y). При этом текущая позиция перемещается в точку (x,y)
|
Ellipse(x1,y1,x2,y2)
| Рисование эллипса, вписанного в прямоугольник, задаваемый точками (x1,y1), и (x2,y2)
|
Продемонстрируем использование процедур класса TCanvas на примере изображения треугольника с известными сторонами. Расположим треугольник, как показано на следующем рисунке:
,
Перепишем процедуру обработки события от нажатия кнопки
Button1 из рассмотренного ранее примера.
Пример
PROCEDURE TForm1.Button1Click(Sender: TObject);
VAR
a,b,c,p,s,h:Real;
BEGIN
WITH Image1.Picture.Bitmap DO
BEGIN
Width:=Image1.Width;
Height:=Image1.Height;
END;
a:=150;b:=100;c:=120;
p:=(a+b+c)/2;
s:=Sqrt(p*(p-a)*(p-b)*(p-c));
WITH Image1.Picture.Bitmap.Canvas DO
BEGIN
MoveTo(0,0);
LineTo(Round(a),0);
h:=2*s/a;
LineTo(Round(Sqrt(Sqr(c)-Sqr(h))),Round(h));
LineTo(0,0);
END;
END;
Результат работы программы представлен на следующем рисунке.