Lazarus – GRAFIKA
GDI
(ang. Graphics Device Interface)
GDI odpowiedzialne jest za przedstawianie
obiektów graficznych i przesyłanie ich do
urządzeń
wyjściowych,
takich
jak monitory i drukarki.
Funkcje zawarte w GDI umożliwiają
wszystkiego
podstawowe
sposoby
„rysowania” (elementy geometryczne,
tekstowe, rastrowe) na powierzchni okien
i innych obiektów w systemie Windows.
2
TCanvas
(ang.Canvas-płótno)
Większość obiektów graficznych
posiada własność Canvas typu
TCanvas;
Udostępnienie takiej właściwości przez
komponent umożliwia bezpośrednie
„rysowanie” po jego powierzchni.
3
TCanvas
Wspólne właściwości obiektu TCanvas
to:
- Font
- Brush
- Pen
- PenPos
- Pixels
4
TCanvas
• Arc
• Chord
• CopyRect
• Draw
• Ellipse
• FillRect
• FloodFill (VCL only)
• FrameRect (VCL only)
• LineTo
• MoveTo
5
Pie
Polygon
Polyline
Rectangle
RoundRect
StretchDraw
TextHeight, TextWidth
TextOut
TextRect
Wspólne metody udostępnione przez obiekt TCanvas
to:
TCanvas
LineTo
procedure LineTo(X: Integer; Y:
Integer);
Rysuje linię od punktu określonego
przez PenPos do punktu określonego
przez współrzędne X,Y
np. Form1.Canvas.LineTo(100,100);
Gdzie jest punkt (100,100)?
Gdzie jest punkt (0,0)?
Dlaczego takie położenie linii?
6
TCanvas
Form1.Canvas.MoveTo(100,100);
Form1.Canvas.LineTo(100,200);
Form1.Canvas.LineTo(200,200);
Form1.Canvas.LineTo(200,100);
Form1.Canvas.LineTo(100,100);
7
form1.Canvas.PenPos.X:=
100;
form1.Canvas.PenPos.Y:=
100;
form1.Canvas.PenPos.X:=
100;
form1.Canvas.PenPos.Y:=
100;
Form1.Canvas.PenPos:=Point(100,100);
Form1.Canvas.PenPos:=Point(100,100);
TCanvas
Rectangle
procedure Rectangle(X1: Integer; Y1: Integer; X2: Integer; Y2: Integer);
procedure Rectangle(var Rect: TRect);
1)
Form1.Canvas.Rectangle(100,100,200,200);
2)
Form1.Canvas.Rectangle(Rect(100,100,200,200));
2’)
var
Prostokat:TRect;
begin
Prostokat:=Rect(100,100,200,200);
Form1.Canvas.Rectangle(Prostokat);
end;
8
Jakie wady w zastosowaniu ma
Rectangle w porównaniu z
MoveTo, LineTo?
TCanvas
FillRect
procedure FillRect (X1, Y1, X2, Y2 : Integer);
procedure FillRect (const Rect : TRect);
Prostokąt wypełniony kolorem
Form1.Canvas.Brush.Color:=clGreen;
Form1.Canvas.FillRect(0,0,200,100);
Lub
Form1.Canvas.Brush.Color:=clGreen;
Form1.Canvas.FillRect(rect(0,0,200,100));
9
Tcanvas
Ellipse
procedure Ellipse (X1, Y1, X2, Y2 :
Integer);
procedure Ellipse (const Rect :
TRect);
Form1.Canvas.Ellipse(0,0,200,100);
lub
Form1.Canvas.Ellipse(rect(0,0,200,100));
10
TCanvas
Arc
procedure Arc (X1, Y1, X2, Y2,
X3, Y3, X4, Y4: Integer);
Procedura rysująca wycinek elipsy
(łuku)
1) Rysowanie w kierunku
przeciwnycm do ruchu wskazówek
zegara
2) Prawe ramie kąta rozwarcia łuku
to kierunek powstały w wyniku
połączenie punktów środka elipsy i
punktu nr 3
3) Lewe ramie kąta rozwarcia łuku to
kierunek powstały w wyniku
połączenie punktów środka elipsy i
punktu nr 4
11
TCanvas
Arc
Form1.Canvas.Arc(
0,10,
200,410,
300,110,
100,0);
Jak narysować okrąg, wycinek łuku
kołowego?
12
TCanvas
Polyline
Form1.Canvas.Polyline(
[Point(100,100),
Point(100,200),
Point(200,200),
Point(200,100),
Point(100,100)]);
13
TCanvas
Polygon
procedure Polygon(var Points: array of
TPoint);
Form1.Canvas.Polygon(
[Point(100,100),
Point(100,200),
Point(200,200),
Point(200,100)]);
Tablica może być tablicą dynamiczną, może być też podtablicą (użycie funkcji
slice);
14
var
Punkty:array [0..100] of
TPoint;
begin
punkty[0]:=Point(100,100)
;
punkty[1]:=Point(200,100)
;
punkty[2]:=Point(200,200)
;
punkty[3]:=Point(100,200)
;
Form1.Canvas.Polygon(
slice(Punkty,4));
end;
TCanvas
TBrush
Brush (ang. pędzel, szczotka)- wzorzec i
kolor wypełniania
Wybrane właściwości:
- Bitmap
: zawiera zewnętrzną bitmapę
obrazu definiującego wzorzec wypełnenia
- Color
: definiuje kolor wypełnienia
- Handle
: udostępnia „uchwyty” do
systemowych definicji wzorców Brush
- Style
: styl wypełniania (wypełnienie nie
musi być jednolite);
15
TCanvas
TBrush
Kolejne przykłady będą zawierały kod
(oznaczony jak „
rysowanie wielokąta
”) w
postaci:
Form1.Canvas.Polygon([
Point(50,100),
Point(100,0),
Point(220,50),
Point(250,100),
Point(100,200)]);
16
TCanvas
TBrush.Color
Form1.Canvas.Brush.Color:=clRed;
Rysowanie wielokąta
Form1.Canvas.Brush.Color:=RGBToColor($00,$
ff,$00);
Rysowanie wielokąta
17
TCanvas
TBrush.Color
Form1.Canvas.Brush.Style:=bsCross;
Rysowanie wielokąta
bsBDiagonal; bsDiagCross
bsSolid
18
Dostępne wartości:
bsSolid, bsCross, bsClear, bsDiagCross, bsBDiagonal,
bsHorizontal, bsFDiagonal, bsVertical
TCanvas
TBrush.Bitmap
var
Bitmapa_Pedzla : TBitmap;
begin
Bitmapa_Pedzla:=TBitmap.Create;
Bitmapa_Pedzla.LoadFromFile(
'c:/gik.bmp
');
Canvas.Brush.Bitmap:=Bitmapa_Pedzla;
end;
Rysowanie wielokąta
19
TCanvas
TPen
Pen (ang.pióro, pisak);
To narzędzie do rysowania linii, punktów etc.
W odróżnieniu do Brush nie określa sposobu wypełniania
rysowanych kształtów a jedynie ich krawędzi.
Główne właściwości:
• Color
– kolor „pisaka”, ustawiany podobnie jak w
Brush;
• Style – styl „pisaka” tj. wzór jaki będzie on
pozostawiał;
• Width
– szerokość „pisaka”’;
• Mode – sposób pokrywania zamalowanej już
powierzchni
20
TCanvas
TPen.Color
Form1.Canvas.Brush.Color:=clGreen;
Form1.Canvas.Pen.Color:=clRed;
Rysowanie wielokąta
21
TCanvas
TPen.Width
Form1.Canvas.Brush.Color:=clGreen;
Form1.Canvas.Pen.Color:=clRed;
Form1.Canvas.Pen.Width:=10;
Rysowanie wielokąta
22
TCanvas
TPen.Style
Form1.Canvas.Brush.Color:=clGreen;
Form1.Canvas.Pen.Color:=clRed;
Form1.Canvas.Pen.Width:=10;
Form1.Canvas.Pen.Style:=psDashDotD
ot;
Rysowanie wielokąta
23
Dostępne wartości:
psSolid-ciągły
psDash – kreskowany
psDot - kropkowany
psDashDot - kreska , kropka
psDashDotDot – kreska,
kropka,kropka
psClear - przezroczysta
TCanvas
TPen.Mode
Form1.Canvas.Brush.Color:=clGreen;
Form1.Canvas.Pen.Color:=clRed;
Form1.Canvas.Pen.Width:=25;
Rysowanie wielokąta
Form1.Canvas.pen.Mode:=pmMaskNotPen;
Form1.Canvas.MoveTo(0,0);
Form1.Canvas.lineTo(300,300);
24
TCanvas
TPen.Mode
Operacje logiczne podczas rysowanie kolorem „pisaka” P i kolorem „tła” T po
jakim rysuje pisak:
• pmBlack – 0 (zawsze czarny),
• pmWhite – 1 (zawsze biały),
• pmNop – T (bez zmiany),
• pmNot – not T (negacja koloru T),
• pmCopy – P (standardowe rysowanie w kolorze T),
• pmNotCopy – not P (negacja koloru P),
• pmMergePenNot – P lub negacja T,
• pmMaskPenNot – P lub negacja T,
• pmMergeNotPen – negacja P lub T,
• pmMaskNotPen – negacja P i T, (logiczne „i”)
• pmMerge – P lub T,
• pmNotMerge – negacja (P lub T )
• pmMask – P i T, (logiczne „i”)
• pmNotMask – negacja (P and T)
• pmXor – P xor T,
• pmNotXor – negacja(P xor T).
Operacje logiczne podczas rysowanie kolorem „pisaka” P i kolorem „tła” T po
jakim rysuje pisak:
• pmBlack – 0 (zawsze czarny),
• pmWhite – 1 (zawsze biały),
• pmNop – T (bez zmiany),
• pmNot – not T (negacja koloru T),
• pmCopy – P (standardowe rysowanie w kolorze T),
• pmNotCopy – not P (negacja koloru P),
• pmMergePenNot – P lub negacja T,
• pmMaskPenNot – P lub negacja T,
• pmMergeNotPen – negacja P lub T,
• pmMaskNotPen – negacja P i T, (logiczne „i”)
• pmMerge – P lub T,
• pmNotMerge – negacja (P lub T )
• pmMask – P i T, (logiczne „i”)
• pmNotMask – negacja (P and T)
• pmXor – P xor T,
• pmNotXor – negacja(P xor T).
25
TCanvas
ClipRect
Funkcja określająca wielkogść „płótna”
– obszaru na którym istnieje
możliwość rysowania – poza nim nic
nie zostanie narysowane.
ShowMessage('Max X Canvas to:’
+inttostr(Form1.Canvas.ClipRect.Ri
ght));
26
TCanvas
TFont
Font (ang.czcionka) – obiekt obsługujący
formatowanie umieszczanego na TCanvas
tekstu.
Główne własności to
• Color – jak w poprzednich obiektach
• Height, Size – dwa parametry powiązane
ze sobą określające wielkość czcionki
• Name – nazwa kroju pisma
• Style – style (poczyła, pogrubiona itp.
czcionka)
27
TCanvas
TFont .Size i .Height
28
Font.Height := (Font.Size * Font.PixelsPerInch /72) –
liczba typu Integer
TCanvas TextOut
TFont .Name
procedure TextOut(X: Integer; Y: Integer; const Text:
string);
Przykład użycia
Form1.Canvas.Font.Name:='Arial';
Form1.Canvas.Font.Size:=10;
Form1.Canvas.TextOut(10,10,'Geodezja');
Form1.Canvas.Font.Size:=15;
Form1.Canvas.TextOut(20,29,'I');
Form1.Canvas.Font.Name:='Comic Sans MS';
Form1.Canvas.Font.Size:=25;
Form1.Canvas.TextOut(10,45,'Kartografia');
29
TCanvas TextOut
function TextHeight (const Text : string) : Integer;
– wysokość tekstu w pikselach
function TextWidth (const Text : string) : Integer;
– szerokość tekstu w pikselach
Przykład użycia
var
pozycja_x:integer;
begin
Form1.Canvas.Font.Name:='Arial';
Form1.Canvas.font.Size:=10;
pozycja_x:=10;
Form1.Canvas.TextOut(pozycja_x,10,'Geodezja ');
pozycja_x:=pozycja_x+Form1.Canvas.
TextWidth
('Geodezja ');
Form1.Canvas.TextOut(pozycja_x,10,'I ');
pozycja_x:=pozycja_x+Form1.Canvas.
TextWidth
('I ');
Form1.Canvas.TextOut(pozycja_x,10,'Kartografia');
end;
30
TCanvas TextOut
TFont .Style
Własność typu wyliczeniowego mogąca
przyjąć jedną lub kilka z
zdefiniowanych wartości: fsBold,
fsItalic, fsUnderline, fsStrikeOut
31
Form1.Canvas.Font.style:=[];
Form1.Canvas.TextOut(10,10,'Geodezja i Kartografia');
Form1.Canvas.Font.style:=[fsBold];
Form1.Canvas.TextOut(10,25,'Geodezja i Kartografia');
Form1.Canvas.Font.style:=[fsItalic];
Form1.Canvas.TextOut(10,40,'Geodezja i Kartografia');
Form1.Canvas.Font.style:=[fsItalic,fsBold];
Form1.Canvas.TextOut(10,55,'Geodezja i Kartografia');
Form1.Canvas.Font.style:=[fsItalic,fsBold,fsStrikeOut];
Form1.Canvas.TextOut(10,70,'Budownictwo');
TCanvas
CopyMode
Parametr określający jak będą wykonywane operacje kopiowania fragmentów obrazu.
T-kolor piksela tła, O-kolor piksela kopiowanego (nazwa wartości – działanie)
cmBlackness – kolor czarny
cmDstInvert – negacja T
cmMergeCopy – O and T (logiczne i)
cmMergePaint – (negacja O) lub T,
cmNotSrcCopy – negacja O,
cmNotSrcErase – negacja(O lub T),
cmPatCopy – wzorzec (pisaka),
cmPatInvert – wzorzec xor T,
cmPatPaint – (negacja O lub wzorzec) lub T,
cmSrcAnd – O and T
cmSrcCopy – O – domyślna wartość
cmSrcErase – O and (negacja T),
cmSrcInvert – O xor T,
cmSrcPaint – O or T,
cmWhiteness – kolor biały
32
TCanvas
CopyRect
procedure CopyRect (
Gdzie _prost: TRect;
Skąd_Canvas : TCanvas;
Skąd_prst : TRect);
Procedura kopiująca prostokątne
fragmenty obrazu w nowe
miejsca.
Form1.Canvas.CopyRect
(rect(300,300,400,400),
Form1.Canvas,
rect(0,0,300,300));
33
Tcanvas
Draw
var
Obrazek:TBitmap;
begin
Obrazek:=TBitmap.Create;
Obrazek.LoadFromFile('c:/gik.bmp');
Form1.Canvas.Draw(0,0,obrazek);
Obrazek.Free;
end;
34
procedure Draw (X, Y : Integer; Graphic :
TGraphic);
„Wkleja” obraz (oryginalny rozmiar)
przechowywany w TGraphic np.TBitmap
TCanvas
StrechDraw
var
Obrazek:TBitmap;
begin
obrazek:=TBitmap.Create;
obrazek.LoadFromFile('c:/gik.bmp');
form1.canvas.StretchDraw(rect(0,0,50,50),obrazek);
form1.canvas.StretchDraw(rect(50,50,250,250),obrazek);
obrazek.Free;
end;
35
procedure StrechDraw (const Rect :
Trect;Graphic : TGraphic);
„Wkleja” rozciągniety obraz przechowywany
w TGraphic np.TBitmap
TCanvas
Pixels
Dostęp do pojedynczego piksela
Zarówno do zapisu jak i odczytu
36
var
i:integer;
begin
For i:=0 to 100 do
Form1.Canvas.Pixels[i,i]:=$0000ff;
ShowMessage(inttostr(Form1.Canvas.Pixels[0,
0]));
end;
var
i:integer;
begin
For i:=0 to 100 do
Form1.Canvas.Pixels[i,i]:=$0000ff;
ShowMessage(inttostr(Form1.Canvas.Pixels[0,
0]));
end;
Dla zainteresowanych
Przyspieszenie operacji na
pojedynczych pikselach – funkcja
Scanline
37
TBitmap
Bitmapy, tj. mapy bitowe, są reprezentacją obrazu rastrowego w pamięci wewnętrznej
(RAM) lub zewnętrznej (strumien, plik).
Bitmapę można przechowywać w pamięci za pomocą obiektu TBitmap.
TBitmap nie jest komponentem, jest obiektem i można skopiować zawartość bitmapy na
„inny” Canvas
TBitmap jest Obiektem – przed jej użyciem należy więc utworzyć jego instancję:
Najczęścięj wykorzystywane metody TBitmap to:
LoadFromFile(‘nazwa_pliku.bmp’);
SaveToFile(‘nazwa_pliku.bmp’);
Najczęściej wykorzystywanymi właściwościami:
Width, Height,
Canvas – dzięki której istnieje możliwość skopiowanie Bitmapy na płótno np. Formularza.
38
Var
Obrazek:TBitmap;
Begin
Obrazel:=TBitmap.Cr
eate;
//użycie Bitmapy
//i zwolnienie jej
zasobów
Obrazek.Free; //!!!!
End;
Var
Obrazek:TBitmap;
Begin
Obrazel:=TBitmap.Cr
eate;
//użycie Bitmapy
//i zwolnienie jej
zasobów
Obrazek.Free; //!!!!
End;
TImage
(komponent)
Przeznaczony do wyświetlania obrazów
rastrowych zapisanych w formatach:
BMP,XMP,PNG,PBM,PGM,PPM,JPG,ICNS,
CURICO,WMF.
Najczęściej wykorzystywane metody:
(metoda podobiektu Picture)
Picture.LoadFromFile(‘grafika.bmp’);
Najczęściej wykorzystywane właściwości:
Width,Height,Strech,Autosize
39