Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen:...

21
Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: Units Strukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien

Transcript of Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen:...

Page 1: Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien.

Agenda für heute, 20. Juni, 2010

• Strukturieren von Programmen: Units Strukturieren von Programmen: Units

• Datentypen: Unterbereichstypen

• Übung 7: Bitmap-Dateien

Page 2: Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien.

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Strukturieren von Programmen

1. Schritt: Gliederung des Quellcodes

Einem Programm können wir Struktur verleihen, indem wir es in

Prozeduren gliedern, von denen jede eine spezielle Aufgabe

innerhalb des Progamms übernimmt.

2. Schritt: Import von Objektcode

Die Struktur eines Programms können wir ergänzen, indem wir

bereits kompilierte Prozeduren in den Objektcode des

Programms importieren.

2/19

Page 3: Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien.

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Import von Objektcode aus einer "Unit"

program xyz;

uses math;

var alpha: integer; sinalpha: real;

begin { main }. . .read(alpha);sinalpha:= sin(alpha);write('Sinus von ',alpha,': ';. . .

Diese Anweisung sagtdem Compiler, dass allein der Unit "Math" dekla-rierten Prozeduren demProgramm zur Verfügungstehen sollen.

3/19

Page 4: Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien.

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Getrennte Kompilation von Programmen und Units

Programm

Quellcode

Unit A

Quellcode

Compiler

Unit A

Objektcode

Programm

Objektcode

Muss neu kompiliert werden,wenn das Programm oder eine der Units geändert wird.

Unit B

Quellcode

Unit B

Objektcode

Muss neu kompiliert werden,wenn die Unit geändert wird.

Üb

ers

chau

bar

keit

dur

ch M

odu

lari

sie

rung

(Pro

gram

mie

ren

im G

ross

en)

4/19

Page 5: Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien.

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Sichtbarkeit bei Units

program X;uses A;

var R, S: integer;

begin R:= S + 1;

p1;

p2;

end.

unit A;

interfaceprocedure p1; procedure p2;

implementation

var j: real;

procedure p1;begin . . .end;

procedure p2;var k: real;begin k := k*j; . . .end;

end.5/19

Page 6: Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien.

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Sichtbarkeit bei Units

program X;uses A;

var R, S: integer;

begin R:= S + 1; j:= R - S; p2;

q3;

end.

unit A;

interfaceuses B; var j: real;procedure p2;

implementation

procedure p2;var k: real;begin

k := k*j; q1; . . .

end;end.

unit B;

interfaceprocedure q1procedure q2procedure q3;

implementation

procedure q1;begin

. . .end;

. . .

end.

kann via Unit A auch dieBezeichner im Interfacevon Unit B verwenden

6/19

Page 7: Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien.

• Strukturierung von Programmen: Units

• Datentypen: UnterbereichstypenDatentypen: Unterbereichstypen

• Übung 7: Bitmap-Dateien

Page 8: Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien.

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Unterbereichstypen

Wird bei der Verwendung einer Variablen vorausgesetzt, dass sie nur Werte innerhalb eines zusammenhängenden Teilbereichs eines ordinalen Typs annehmen darf, dann kann dies durch das Deklarieren eines Unterbereichstyps überwacht werden.

const n = 1000;type Teilbereich = 1..n;var x: Teilbereich;

oder:var x: 1..1000;

Die Konstanten, welche die Bereichsgrenzen angeben, müssen vom gleichen ordinalen Typ, dem Host-Typ sein.

Alle Operationen, die über den Werten des Host-Typs zulässig sind, können auch über den Werten des Unterbereichstyps ausgeführt werden.

7/19

Page 9: Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien.

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Unterbereichstypen

Beispieletype Kleinbuchstabe = 'a'..'z'; Ziffer = '0'..'9'; Index = 1..25; Werktag = Montag..Freitag;

Als Unterbereich des Aufzählungstyps Tag

varEingabezeichen: Kleinbuchstabe;

A: array[Index] of real;

Arbeitstag: Werktag;

Wtage: array[Werktag] of integer;

x: integer;

x:= Wtage[dienstag]

8/19

Page 10: Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien.

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Unterbereichstypen: Eigenschaften

Verschiedene Unterbereiche eines bestimmten Typs können im gleichen Ausdruck vorkommen.

var klein: 1..10; mittel: 0..100; gross: integer;

Der folgende Ausdruck ist gültig:

klein * mittel + gross

9/19

Page 11: Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien.

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Unterbereichstypen: Eigenschaften

Unterbereichstypen können auf beiden Seiten einer Zuweisungs-anweisung stehen:

0..100 1..10

mittel:= klein;

klein:= mittel;

1..10 0..100

Prüfung nur während der Programmausführung möglich.

(Mit Bereichsprüfung kompilieren).

10/19

Page 12: Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien.

• Strukturieren von Programmen: Units

• Datentypen: Unterbereichstypen

• Übung 7: Bitmap-DateienÜbung 7: Bitmap-Dateien

Page 13: Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien.

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Praxismodul 7: Bildanalyse

Problemstellung: Anteil der Waldfläche auf der Luftaufnahme eines Geländeausschnittes

Programmiermethodik: Spiralmodell

Inkrementelles Vorgehen

1. Bild einlesen, anzeigen, manipulieren

2. Pixel, die Wald darstellen erkennen und zählen

3. Angenäherte Lösung entwickeln (MC Methode)

11/19

Page 14: Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien.

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Bitmap-Dateien

BMP-Dateien bestehen aus drei Teilen: dem Dateikopf, dem Informationsblock und den Bilddaten.

Dateikopf

(BITMAPFILEHEADER)

Informationsblock

(BITMAPINFO):Bitmap-Eigenschaften

(BITMAPINFOHEADER)Eventuell: Farbmasken

Eventuell: Farbtabelle

Eventuell: Ungenutzter Platz

Bilddaten

Eventuell: Ungenutzter Platz

14 Byte

40 Byte

12/19

Die Bilddaten werden zeilenweise gespeichert. In der Regel beginnen die Bilddaten mit der letzten und enden mit der ersten Bildzeile.

Page 15: Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien.

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Bitmap-Dateien

13/19

bmpheader = packed record {----- fileinfo --------} bfType: word; bfSize: longint; bfReservde1: word; bfReserved2: word; bfOffBits: longint; {----- Bildinfo --------} biSize: longint; biWidth: longint; biHeight: longint; biPlanes: word; biBitCount: word; biCompress: longint; biSizeImage: longint; biXPPM: longint; biYPPM: longint; biClrUsed: longint; biClrImport: longint;end;

Typendeklaration für Filevariable um Dateikopf und Informationsblock einer Bitmap-Datei einzulesen.

Page 16: Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien.

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Bitmap-Dateien lesen

14/19

Delphi stellt eine Komponente "Image" zur Verfügung mit der Bilddaten bearbeitet werden können

Um ein Bild einzulesen wird

Image.Picture.LoadFromFile(Dateiname);

aufgerufen

Page 17: Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien.

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Bitmap-Dateien lesen

15/19

In den Feldern Image.Height und Image.Width werden anschliessend die Bildhöhe resp. die Bildbreite angegeben

Im Feld Image.Canvas wird das Bild gespeichert

Mit Image.Canvas.Pixel(x,y) wird auf den Pixel an der Position x,y im Bild zugegriffen

Page 18: Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien.

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Bitmap-Dateien lesen

16/19

Im Gegensatz zu Textdateien müssen bei Bilddateien zuerst Daten mit Informationen über die gespeicherten Daten (das Bild) gelesen werden

Der erste Zugriff geschieht auf eine typisierte Datei (Datentyp Record für Dateikopf und Informationsblock)

Die nächsten Zugriffe lesen die Bilddaten Byte um Byte (untypisierte Datei)

Delphi erledigt diese Operationen für uns, wir können sie aber auch selber ausprogrammieren (z.B. im TurboPascal)

Page 19: Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien.

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Prinzip der Rasterdaten

rot

rot

blau

gelb

türkis

grün

grün

schwarz

. . .

0

1

2

3

Farbe des Bild-punktes (Pixel):

1024

1025

1026

0

1

23

1024

1025

1026

blau grün rot

255 0 0

255 0 0

0 0 255

255 255 0

44 172 212

0 255 0

0 255 0

0 0 0

rgb-Werte,die als Bilddaten gespeichert werden:

17/19

4 4

16'711'680

16'711'680

255

16'776'960

2'927'828

65'280

65'280

0

. . .

0

1

2

3

Kombinierter rgb-Wert:

1024

1025

1026

4

Page 20: Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien.

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Bitmap-File von Übung 7 selber einlesen

var bildheader: file of bmpheader; bh: bmpheader; binfo: file of byte; i: integer; b:byte;

begin AssignFile(bildheader,'Bild1.bmp'); Reset(bildheader); read(bildheader,bh); CloseFile(bildheader); AssignFile(binfo,'Bild1.bmp'); Reset(binfo)end;

for i:= 1 to bh.bfOffBits do Read(binfo,b); {fileheader überspringen}

{ab hier Bilddaten verarbeiten}

18/19

Page 21: Agenda für heute, 20. Juni, 2010 Strukturieren von Programmen: UnitsStrukturieren von Programmen: Units Datentypen: Unterbereichstypen Übung 7: Bitmap-Dateien.

Programmieren und Problemlösen © Institut für Computational Science, ETH Zürich

Bitmap-File von Übung 7 selber einlesen (Fortsetzung)

varbl, gr, rot: byte;x, y, i: cardinal;

for y:= bh.biHeight-1 downto 0 do

begin

for x:= 0 to bh.biWidth-1 do

begin

Read(binfo,bl); Read(binfo,gr); Read(fi1,rot);

Image1.Canvas.pixels[x,y]:= 65536*bl+256*gr+rot;

end; for i:= 1 to bh.biWidth mod 4 do Read(binfo,rot)

{die Null-Einträge am Ende der Zeile überspringen}end;

19/19