Delphi Grundkurs Seite 49 6. Grafikprogrammierung Die Grafikoperationen beziehen sich immer auf die Zeichenoberfläche (Leinwand, Canvas) eines bestimmten Objekts. (0,0) des Formulars Image - Komponentenpalette Zusätzlich (0,0) des Images Image.Top Canvas.Pen Pen.Width Pen.Color Pen.Style Image.Left Image.Height Form.Height Canvas.Brush Brush.Color Brush.Style Image.Canvas.Pen Canvas.Font... Font.Name Image.Canvas.Brush Font.Color... Font.Style Image.Canvas.Font Font.Size Image.Width Form.Width Farbe: Var Farbe : TColor; // vordefinierter Objekttyp Farbe := RGB( R, G, B ); // R-Rot; G-Grün; B-Blau 0.. 255 0.. 255 0.. 255 256³ 16 Millionen Farbkombinationen möglich (TrueColor) Koordinaten: Unit JPEG: Farbe := clred; var P : TPoint; P.X := 10; P.Y := 20; // entspricht RGB(255, 0, 0) // vordefinierter Datentyp zur Speicherung von // Punktkoordinaten type TPoint = record X : Integer; Y : Integer; Zum Laden und Speichern von Bildern (*.bmp; *.jpg)
Delphi Grundkurs Seite 50 Beispiel 15 Zufallsgrafik Problem: Programm P15 (\Grafikbeispiele) Zeichnen von Punkten, Strecken, Rechtecken, Ellipsen mit Zufallskoordinaten; Ausgabe eines Textes im Image. Formulardesign: Grafikbefehle: Image.Canvas.Pixels[x,y] := Farbe; // Punkt mit Koordinaten (x,y) in Farbe Farbe // zeichnen Image.Canvas.MoveTo(x1,y1); Image.Canvas.LineTo(x2,y2); // unsichtbaren Grafikcursor auf (x1,y1) // positionieren // Linie von (x1,y1) nach (x2,y2) zeichnen Image.Canvas.Rectangle(x1,y1,x2,y2); // Rechteck zeichnen // (x1,y1) linker oberer Eckpunkt // (x2,y2) rechter unterer Eckpunkt Image.Canvas.Ellipse(x1,y1,x2,y2); // Ellipse zeichnen // Koordinaten wie oben Image.Canvas.TextOut(x,y,s); // Ausgabe des Strings s an Position (x,y)
Delphi Grundkurs Seite 51 Listing: unit P15_U; // Zufallsgrafik interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Printers; type TForm1 = class(tform) Panel1 : TPanel; // Container für Image Image1 : TImage; Button1: TButton; // Punkte Button2: TButton; // Linien Button3: TButton; // Rechtecke Button4: TButton; // Ellipsen Button5: TButton; // Text Button6: TButton; // Drucken Button7: TButton; // Beenden Button8: TButton; // Neu Label1 : TLabel; Bevel1 : TBevel; Bevel2 : TBevel; procedure FormActivate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure Button8Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } var Form1: TForm1; implementation {$R *.DFM} var XMax : Integer; // Höchstanzahl horizontaler Bildpunkte YMax : Integer; // Höchstanzahl vertikaler Bildpunkte Farbe : TColor; // Farbe; TColor - vordefinierter Objekttyp R, // Rotanteil G, // Grünanteil B : Integer; // Blauanteil
Delphi Grundkurs Seite 52 x1, y1, // Koordinaten x2, y2 : Integer; procedure Bild_loeschen; // Grafikbild löschen with Form1.Image1.Canvas do Brush.Style := bssolid; // Art der Musterfüllung Brush.Color := clwhite; // Füllfarbe Pen.Width := 1; // Stiftdicke Pen.Color := clblack; // Zeichenfarbe Rectangle(0,0,XMax,YMax); Brush.Style := bsclear; procedure Zufallsfarbe; R := Random(256); G := Random(256); B := Random(256); Farbe := RGB(R,G,B); procedure Zufallskoordinaten; x1 := Random(XMax); y1 := Random(YMax); x2 := Random(XMax); y2 := Random(YMax); procedure TForm1.FormActivate(Sender: TObject); // Globale Variable initialisieren und Grafikbild löschen Randomize; Form1.Image1.Visible := True; XMax := Form1.Image1.Width; YMax := Form1.Image1.Height; Bild_loeschen; procedure TForm1.Button1Click(Sender: TObject); // Punkte zeichnen var I : Integer; for I := 1 to 100 do Zufallsfarbe; Zufallskoordinaten; Image1.Canvas.Pixels[x1,y1] := Farbe;
Delphi Grundkurs Seite 53 procedure TForm1.Button2Click(Sender: TObject); // Strecke zeichnen Zufallsfarbe; Zufallskoordinaten; with Image1.Canvas do Pen.Color := Farbe; Pen.Width := Random(10) + 1; MoveTo(x1,y1); // Unsichtbaren Grafikcursor auf (x1,y1) positionieren LineTo(x2,y2); // Linie von (x1,y1) zu (x2,y2) zeichnen procedure TForm1.Button3Click(Sender: TObject); // Rechteck zeichnen Zufallsfarbe; Zufallskoordinaten; with Image1.Canvas do Pen.Color := Farbe; Brush.Color := Farbe; Pen.Width := Random(10) + 1; Rectangle(x1,y1,x2,y2); procedure TForm1.Button4Click(Sender: TObject); // Ellipse zeichnen Zufallsfarbe; Zufallskoordinaten; with Image1.Canvas do Pen.Color := Farbe; Brush.Color := Farbe; Pen.Width := Random(10) + 1; Ellipse(x1,y1,x2,y2); procedure TForm1.Button5Click(Sender: TObject); // Text 'Hallo' ausgeben Zufallsfarbe; Zufallskoordinaten; with Image1.Canvas do Font.Size := Random(100) + 1; // Schriftgröße Font.Color := Farbe; // Schriftfarbe Brush.Style := bsclear; // Füllmuster
Delphi Grundkurs Seite 54 TextOut(x1,y1,'Hallo'); procedure TForm1.Button6Click(Sender: TObject); // Formular ausdrucken PrintScale := poproportional; Print; procedure TForm1.Button7Click(Sender: TObject); // Beenden Application.Terminate; procedure TForm1.Button8Click(Sender: TObject); // Grafikbild löschen Bild_loeschen; end.
Delphi Grundkurs Seite 55 Beispiel 16 Zeichnen und malen Programm P16 (\Grafikbeispiele) Problem: Jede Mausbewegung mit gedrückter linker Maustaste erzeugt eine Linie. Mit der rechten Maustaste werden die relativen Punktkoordinaten (X,Y) angezeigt. Die Grafikdatei kann geladen und gespeichert werden. Formulardesign: Listing: unit P16_U; // Zeichnen und malen interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Printers; type TForm1 = class(tform) Image1 : TImage; Edit1 : TEdit; Edit2 : TEdit; Label1 : TLabel; Label2 : TLabel; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; // X-Koordinate anzeigen // Y-Koordinate anzeigen // Beschriftungen // Löschen // Beenden // Drucken // Speichern // Laden
Delphi Grundkurs Seite 56 procedure FormActivate(Sender: TObject); procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); private { Private declarations } public { Public declarations } var Form1: TForm1; implementation {$R *.DFM} const GName = 'Rosa.bmp'; procedure ImClear; // Löscht das Image with Form1.Image1 do Canvas.Pen.Color := clblack; Canvas.Brush.Color := clwhite; Canvas.Brush.Style := bssolid; Canvas.Rectangle(0, 0, Width, Height); Canvas.Brush.Style := bsclear; procedure TForm1.FormActivate(Sender: TObject); // Image initialisieren ImClear; procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); // Positionierung des versteckten Grafikcursors an die jeweilige // Mausposition if Button = mbleft then Image1.Canvas.Moveto(X, Y); if Button = mbright then Edit1.Text := 'X = ' + IntToStr(X); Edit2.Text := 'Y = ' + IntToStr(Y);
Delphi Grundkurs Seite 57 procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); // Wenn linke MT gedrückt (Shift-Status) dann Linie zeichnen // von der alten Grafikcursorposition zur neuen Mausposition if Shift =[ssleft] then Image1.Canvas.LineTo(X, Y); Edit1.Text := 'X = ' + IntToStr(X); Edit2.Text := 'Y = ' + IntToStr(Y); procedure TForm1.Button1Click(Sender: TObject); // Löschen ImClear; Edit1.Clear; Edit2.Clear; procedure TForm1.Button2Click(Sender: TObject); // Programm beenden Application.Terminate; procedure TForm1.Button3Click(Sender: TObject); // Gesamtes Formular drucken PrintScale := poproportional; Print; procedure TForm1.Button4Click(Sender: TObject); // Graphik in Bitmap-Datei speichern Image1.Picture.SaveToFile(GName); procedure TForm1.Button5Click(Sender: TObject); // Bitmap-Datei laden Try Image1.Picture.LoadFromFile(GName); Except ShowMessage('Datei "'+ GName + '" nicht gefunden!'); end.
Delphi Grundkurs Seite 58 Beispiel 17 Programm P17 (\Grafikbeispiele) Zeichnen und malen - Polygon Problem: Jede Mausbewegung mit gedrückter linker Maustaste erzeugt eine Linie. Mit der rechten Maustaste werden die relativen Punktkoordinaten (X,Y) angezeigt und fortlaufend in einem Punktspeicher abgelegt. Die gespeicherten Punkte werden durch ein Polygon verbunden. Die Grafikdatei kann geladen und gespeichert werden. Formulardesign: Listing: unit P17_U; // Zeichnen und malen - Polygon interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Printers; type TForm1 = class(tform) Image1 : TImage; Edit1 : TEdit; Edit2 : TEdit; Label1 : TLabel; Label2 : TLabel; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton;
Delphi Grundkurs Seite 59 Button5: TButton; Button6: TButton; // Polygon procedure FormActivate(Sender: TObject); procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); private { Private declarations } public { Public declarations } var Form1: TForm1; implementation {$R *.DFM} const GName = 'Rosa.bmp'; var P : array[1..1000] of TPoint; // Punktspeicher N : Integer; // Anzahl der gespeicherten Punkte procedure ImClear; // Löscht das Image var I : Integer; with Form1.Image1 do Canvas.Pen.Color := clblack; Canvas.Brush.Color := clwhite; Canvas.Brush.Style := bssolid; Canvas.Rectangle(0, 0, Width, Height); Canvas.Brush.Style := bsclear; N := 0; for I := 1 to 1000 do P[I].X := 0; P[I].Y := 0; procedure TForm1.FormActivate(Sender: TObject); // Image initialisieren ImClear; procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Delphi Grundkurs Seite 60 // Positionierung des versteckten Grafikcursors an die jeweilige // Mausposition; // Anzeige und Abspeicherung der Koordinaten mit rechter MT if Button = mbleft then Image1.Canvas.Moveto(X, Y); if Button = mbright then N := N + 1; Edit1.Text := 'X = ' + IntToStr(X); Edit2.Text := 'Y = ' + IntToStr(Y); P[N].X := X; P[N].Y := Y; procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer); // Wenn linke MT gedrückt (Shift-Status) dann Linie zeichnen // von der alten Grafikcursorposition zur neuen Mausposition if Shift =[ssleft] then Image1.Canvas.LineTo(X, Y); Edit1.Text := 'X = ' + IntToStr(X); Edit2.Text := 'Y = ' + IntToStr(Y); procedure TForm1.Button1Click(Sender: TObject); // Löschen ImClear; Edit1.Clear; Edit2.Clear; procedure TForm1.Button2Click(Sender: TObject); // Programm beenden Application.Terminate; procedure TForm1.Button3Click(Sender: TObject); // Gesamtes Formular drucken PrintScale := poproportional; Print; procedure TForm1.Button4Click(Sender: TObject); // Graphik in Bitmap-Datei speichern Image1.Picture.SaveToFile(GName);
Delphi Grundkurs Seite 61 procedure TForm1.Button5Click(Sender: TObject); // Bitmap-Datei laden Try Image1.Picture.LoadFromFile(GName); Except ShowMessage('Datei "'+ GName + '" nicht gefunden!'); procedure TForm1.Button6Click(Sender: TObject); // Polygon zeichnen if N = 0 then Exit; with Image1.Canvas do Pen.Color := clred; Pen.Width := 2; Polygon(Slice(P, N)); Pen.Color := clblack; Pen.Width := 1; end.
Delphi Grundkurs Seite 62 Beispiel 18 Programm P18 (\Grafikbeispiele) Einfaches Zeichen- und Malprogramm Problem: Zeichenelemente: Strecke Rechteck Leer oder Voll Kreis aus Mittelpunkt und Kreispunkt Linie mit gedrückter linker Maustaste Koordinatenanzeige und Abspeicherung mit gedrückter rechter Maustaste Liniendicke: einstellbar zwischen 0.. 10 Farbe: Rot, Grün, Blau einstellbar zwischen 0.. 255 Die Grafikdatei kann geladen und gespeichert werden. Formulardesign: Listing: unit P18_U; // Einfaches Zeichen- und Malprogramm interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls,
Delphi Grundkurs Seite 63 Forms, Dialogs, StdCtrls, ExtCtrls, Printers; type TForm1 = class(tform) Image1 : TImage; Edit1 : TEdit; // X-Koordinate anzeigen Edit2 : TEdit; // Y-Koordinate anzeigen Button1 : TButton; // Info Button2 : TButton; // Grafik neu Button3 : TButton; // Grafik laden Button4 : TButton; // Grafik speichern Button5 : TButton; // Grafik drucken Button6 : TButton; // Gerade Button7 : TButton; // Reckteck Button8 : TButton; // Kreis Button9 : TButton; // Leer Button10 : TButton; // Voll Button19 : TButton; // Ende Panel1 : TPanel; // Rotanteil anzeigen Panel2 : TPanel; // Grünanteil anzeigen Panel3 : TPanel; // Blauanteil anzeigen Panel4 : TPanel; // Stiftdicke anzeigen Bevel1 : TBevel; Bevel2 : TBevel; Bevel3 : TBevel; Bevel5 : TBevel; Memo1 : TMemo; // Hilfstext ScrollBar1: TScrollBar; // Rotanteil einstellen ScrollBar2: TScrollBar; // Grünanteil einstellen ScrollBar3: TScrollBar; // Blauanteil einstellen ScrollBar4: TScrollBar; // Stiftdicke einstellen procedure FormActivate(Sender: TObject); procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure Memo1DblClick(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure Button8Click(Sender: TObject); procedure Button9Click(Sender: TObject); procedure Button10Click(Sender: TObject); procedure Button19Click(Sender: TObject); procedure ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); procedure ScrollBar2Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer);
Delphi Grundkurs Seite 64 procedure ScrollBar3Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); procedure ScrollBar4Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); private { Private-Deklarationen } public { Public-Deklarationen } var Form1: TForm1; implementation {$R *.DFM} type TPunkt = Record X : integer; Y : integer; // Abspeichern von ganzzahligen // Punktkoordinaten var p1, p2, // Hilfspunkte pm : TPunkt; // Mittelpunkt der Bildleinwand Xmax, Ymax, // Höchstanzahl horiz., vert. Bildpunkte X, Y : Integer; // aktuelle Mausposition R, G, B : Byte; Farbe : TColor; // aktuelle Farbe Dicke : Byte; // Stiftdicke procedure TForm1.FormActivate(Sender: TObject); // Initialisieren WindowState := wsmaximized; Form1.Scaled := True; if (Screen.Width<>800) then Form1.ScaleBy(Screen.Width, 800); R := 0; G := 0; B := 0; procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); // Mit linker MT den unsichtbaren Grafikcursor an (X/Y) setzen. // Mit rechter MT diese Punktkoordinaten (X/Y) anzeigen // und fortlaufend in die beiden Punktspeicher p1, p2 ablegen. var s : string; if Button = mbleft then Image1.Canvas.MoveTo(X,Y) end else Str(X,s); Form1.Edit1.Text := 'X = ' + s; Str(Y,s); Form1.Edit2.Text := 'Y = ' + s; p1 := p2;
Delphi Grundkurs Seite 65 p2.x := X; p2.y := Y; procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer); // Jede Mausbewegung mit gedrückter linker MT erzeugt eine Linie. if Shift = [ssleft] then Image1.Canvas.Pen.Color := Farbe; Image1.Canvas.Pen.Width := Dicke; Image1.Canvas.LineTo(X,Y); procedure TForm1.Memo1DblClick(Sender: TObject); // Memobox ausblenden Form1.Memo1.Visible := False; procedure TForm1.Button1Click(Sender: TObject); // Memobox mit Hilfsinfos einblenden Form1.Memo1.Visible := True; procedure TForm1.Button2Click(Sender: TObject); // Globale Variable initialisieren und Grafikbild löschen. Image1.Visible := True; Xmax := Image1.ClientWidth; Ymax := Image1.ClientHeight; pm.x := Round(Xmax/2); pm.y := Round(Ymax/2); with Image1.Canvas do Brush.Style := bssolid; Brush.Color := clwhite; Pen.Width := 1; Pen.Color := clblack; Rectangle(0,0,Xmax,Ymax); Brush.Style := bsclear; p1.x := 0; p1.y := 0; p2 := p1; procedure TForm1.Button3Click(Sender: TObject); // Grafikdatei "PICT.BMP" laden. try Image1.Picture.LoadFromFile('PICT.BMP'); except ShowMessage('Grafikdatei PICT.BMP nicht gefunden!');
Delphi Grundkurs Seite 66 procedure TForm1.Button4Click(Sender: TObject); // Grafikdatei "PICT.BMP" speichern. Image1.Picture.SaveToFile('PICT.BMP'); procedure TForm1.Button5Click(Sender: TObject); // Formular ausdrucken PrintScale := poproportional; Print; procedure TForm1.Button6Click(Sender: TObject); // Gerade zeichnen with Image1.Canvas do Pen.Color := Farbe; Pen.Width := Dicke; MoveTo(p1.X,p1.Y); LineTo(p2.X, p2.y); procedure TForm1.Button7Click(Sender: TObject); // Rechteck zeichnen with Image1.Canvas do Pen.Color := Farbe; Pen.Width := Dicke; Rectangle(p1.X,p1.Y,p2.X,p2.Y); procedure TForm1.Button8Click(Sender: TObject); // Kreis durch Zentrum p1 und Kreispunkt p2 zeichnen. var r : integer; r := Round(Sqrt((p2.X-p1.X)*(p2.X-p1.X) + (p2.y-p1.y)*(p2.yp1.y))); with Image1.Canvas do Pen.Color := Farbe; Pen.Width := Dicke; Ellipse(p1.X-r,p1.Y-r,p1.X+r,p1.Y+r); procedure TForm1.Button9Click(Sender: TObject); // Art der Farbfüllung auf "transparent" setzen.
Delphi Grundkurs Seite 67 with Image1.Canvas do Pen.Color := Farbe; Pen.Width := Dicke; Brush.Style := bsclear; procedure TForm1.Button10Click(Sender: TObject); // Art der Farbfüllung auf "ausgefüllt" setzen. with Image1.Canvas do Brush.Color := Farbe; Brush.Style := bssolid; procedure TForm1.Button19Click(Sender: TObject); //Programm beenden Application.Terminate; procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); // Rotwert verändern R := ScrollPos; Panel1.Caption := IntToStr(R); Farbe := RGB(R, G, B); with Image1.Canvas do Pen.Color := Farbe; Brush.Color := Farbe; Brush.Style := bssolid; Rectangle(Image1.Width-30, Image1.Height-30, Image1.Width, Image1.Height); procedure TForm1.ScrollBar2Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); // Grünwert verändern G := ScrollPos; Panel2.Caption := IntToStr(G); Farbe := RGB(R, G, B); with Image1.Canvas do Pen.Color := Farbe; Brush.Color := Farbe; Brush.Style := bssolid;
Delphi Grundkurs Seite 68 Rectangle(Image1.Width-30, Image1.Height-30, Image1.Width, Image1.Height); procedure TForm1.ScrollBar3Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); // Blauwert verändern B := ScrollPos; Panel3.Caption := IntToStr(B); Farbe := RGB(R, G, B); with Image1.Canvas do Pen.Color := Farbe; Brush.Color := Farbe; Brush.Style := bssolid; Rectangle(Image1.Width-30, Image1.Height-30, Image1.Width, Image1.Height); procedure TForm1.ScrollBar4Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); // Stiftdicke ändern Dicke := ScrollPos; Panel4.Caption := IntToStr(Dicke); end.