WWW-Programmierung II, Vorlesung 6

<- Vorlesung 5 Übungen Vorlesung 7 ->


22) Fortsetzung Bildbearbeitung

Wie im letzten Abschnitt angekündigt, können wir - zumindest auf speziell konfigurierten Computern - auch mit GD-Versionen größer 1.6 GIF-Bilder erzeugen. Dazu verwenden wir den Befehl convert aus dem Paket ImageMagick, mit dem wir nahezu jedes Bild-Format in jedes andere umwandeln können. Dieses Programm convert liegt (auf dem Übungs-Rechner) im Verzeichnis /usr/X11R6/bin.

Wir gehen nun so vor: Zuerst erzeugen wir ein PNG-Bild wie bisher. Dieses PNG-Bild schicken wir nicht an den Betrachter, sondern speichern es unter dem Namen z123.png in dem Verzeichnis /tmp.

	...
	ImagePNG($im,"/tmp/z.png");
Nun rufen wir aus PHP das Programm convert mit der Datei /tmp/z.png und schicken das erzeugte Bild direkt weiter an den Betrachter:
	passthru("/usr/X11R6/bin/convert /tmp/z.png gif:-");
Zu guter Letzt müssen wir /tmp/z.png wieder löschen:
	unlink("/tmp/z.png");
Insgesamt sieht das Programm so aus:
	Header("Content-type: image/gif");
	$im = ImageCreateFromPng("vec.png");
	$textfarbe = ImageColorAllocate ($im, 0x00, 0x00, 0xff);
	ImageTTFText ($im, 30, 0, 20, 50, $textfarbe,
		"/usr/X11R6/lib/X11/fonts/truetype/comic.ttf",
		"Hallo");

	ImagePNG($im,"/tmp/z.png");
	passthru("/usr/X11R6/bin/convert /tmp/z.png gif:-");
	ImageDestroy($im);
	unlink("/tmp/z.png");
Nicht zu vergessen ist, im Header-Befehl image/png in image/gif umzuwandeln.

Natürlich können wir jederzeit auch ein JPEG-Bild erzeugen:

	Header("Content-type: image/jpeg");
	$im = ImageCreateFromPng("vec.png");
	$textfarbe = ImageColorAllocate ($im, 0x00, 0x00, 0xff);
	ImageTTFText ($im, 30, 0, 20, 50, $textfarbe,
		"/usr/X11R6/lib/X11/fonts/truetype/comic.ttf",
		"Hallo");

	ImagePNG($im,"/tmp/z.png");
	passthru("/usr/X11R6/bin/convert /tmp/z.png jpeg:-");
	ImageDestroy($im);
	unlink("/tmp/z.png");

Ein weiterer interessanter Befehl zur Bildbearbeitung, der in der GD-Bibliothek enthalten ist, ist der Befehl ImageCopyResized(). Damit können Sie Bilder auf Server-Seite vergrößern oder verkleinern. Eine Anwendung dafür wäre zum Beispiel das Erzeugen von Thumbnails auf Knopfdruck:

	Header("Content-type: image/png");
	$im = ImageCreateFromPng("vec.png");

	$im_neu=ImageCreate(50,30);
	ImageCopyResized($im_neu,$im,
		0,0,0,0,
		50,30,ImageSX($im),ImageSY($im));

	ImagePNG($im_neu);
	ImageDestroy($im);
	ImageDestroy($im_neu);
In diesem Beispiel kopieren wir das Bild $im in das Bild $im_neu, das wir vorher mit ImageCreate erzeugen mussten. Das neue Bild wird aber auf die Größe 50x30 verkleinert. Die Eingabe-Parameter von ImageCopyResized() haben folgende Bedeutung:
  1. Neues Bild (Ziel)
  2. Altes Bild (Quelle)
  3. linke obere Ecke des neuen Bildes (2 Werte, hier 0,0)
  4. linke obere Ecke des alten Bildes (2 Werte, hier 0,0)
  5. Breite und Höhe des neuen Bildes (2 Werte, hier 50,30)
  6. Breite und Höhe des alten Bildes (2 Werte, werden mit ImageSX($im) und ImageSY($im) bestimmt)


23) Cookies

Als Cookies werden kurze Informationen bezeichnet, die der WWW-Server beim Client (Betrachter) hinterlassen kann. Sie sind vor allem beim elektronischen Einkaufen im WWW von Bedeutung. Genauer gesagt, sind sie immer dann von Bedeutung, wenn der Server weitergehende Information vom Betrachter haben muß, als nur die Internet-Adresse, die eine Seite anfordert.

Cookies bestehen aus folgender Information:

Will man weder ein Verfallsdatum setzen (dann erlischt die Gültigkeit des Cookies beim Beenden des Browsers), noch den Zugriff auf das Cookie einschränken, so genügt es, setCookie(Name,Wert) aufzurufen.

Beispiel: Wir wollen feststellen, ob ein Betrachter eine Seite schon einmal aufgerufen hat. Dazu setzen wir beim ersten Aufruf der Seite ein Cookie. Dies muß allerdings vor dem HTML-Head geschehen, d.h. am Anfang der Datei. (Unbedingt auch die Ausgabe von Leerzeilen, -zeichen vor diesem PHP-Teil vermeiden!)

<?
	$t = time()+3600*24*10;
	SetCookie("mycookie","Schon besucht",$t,"/test",".de");
?>
<HTML>
...
Dieser Befehl setzt ein Cookie mit dem Namen mycookie auf den Wert "schon besucht" mit einem Verfallsdatum von 10 Tagen. Lesen darf dieses Cookie jeder Server mit der Endung .de, allerdings nur aus Dateien, die in einem Verzeichnis /test oder Unterverzeichnissen davon liegen.

Das Verfallsdatum des Cookie muß in Sekunden seit dem 1. Januar 1970 angegeben werden. Die Funktion time() gibt die Sekunden seit dem 1. Januar 1970 der momentanen Zeit an. Weitere Datums- und Zeitfunktionen sind im Handbuch nachzulesen. Da die Berechnung der Sekunden nicht immer ganz übersichtlich ist, empfiehlt sich die Verwendung einer Funktion:

	function tage ($anzahl) {
		$sekunden = time()+ 3600 * 24 * $anzahl;
		return $sekunden;
	}
	SetCookie("mycookie","Schon besucht",tage(10),"/test",".de");

Es gibt Einschränkungen für die Zahl an Cookies, die ein Browser verwaltet: Bei Netscape sind es 300 Cookies insgesamt, wobei jedes Cookie maximal 4 KiloBytes gro sein darf. Pro Server dürfen höchstens 20 Cookies gespeichert werden.

Cookies lesen ist mit PHP wieder sehr einfach realisiert: Der Inhalt des Cookies ist in einer Variablen mit dem Namen des Cookies enthalten:

	echo "$mycookie";
gibt also den Wert des Cookies aus, in unserem Fall den Text "Schon besucht".

Ein Server kann mit PHP ein Cookie wieder entfernen, indem lediglich der Befehl setcookie mit dem Namen des Cookies als Argument angegeben wird:

	SetCookie("mycookie");
Zu beachten sind weiterhin zwei Dinge:

Anmerkung:
Der Leser wird sich vielleicht mittlerweile fragen, ob PHP mit all den "automatischen" Variablen noch zurechtkommt. Denn es könnte ja eine Variable $name existieren, die aus einem Formular stammt, es könnte auch ein Cookie mit dem Namen name gesetzt sein, etc.

Die Priorität dieser Varaibalen wird in php.ini vom Administrator festgelegt. Es gibt 5 verschiedene Quellen für "automatische" Variable:

Momentan ist der Übungs-Rechner auf EGPCS eingestellt. Die Variablen werden von links nach rechts gesetzt. Das heißt, C wird nach P gesetzt und daher würde die Cookie-Variable $name die Formular-Variable $name überschreiben.


<- Vorlesung 5 Übungen Vorlesung 7 ->

Alfred.Wassermann@uni-bayreuth.de