DPI-Auflösung von Bildern bei PHP-GDlib und FPDF
DPI-Auflösung von Bildern bei PHP-GDlib und FPDF
Mit diesem Beitrag möchte ich mal etwas näher auf die Angabe DPI von Bildern eingehen. Gerade im Zusammenhang mit FPDF (Online-Erstellung von PDF-Dokumenten) gibt es hier immer wieder Unklarheiten.
DPI - Auflösung
Die Auflösung wird als Anzahl der Pixel pro Streckeneinheit (Inch oder cm) angegeben. Sie ist ein Parameter der Bilddatenerfassung, dient zur Rasterung von Bildern die später gedruckt werden sollen und bezieht sich auf das Ausgabemedium. Bilder für Webanwendungen haben keine Auflösung, sondern nur Dimensionen. Der Parameter DPI dient nur für interne Umrechnungen, wenn Bilder auf einen Ausgabemedium ausser Monitor gebracht werden sollen.
FPDF und DPI
Sehr oft werden Bilder in PDF-Dokumente eingebunden, die auch später zum ausdrucken gedacht sind. Wenn wir z.B. ein Bild mit 320 x 240 Pixel einbinden wollen, wäre es im PDF ca. 11 x 8 cm groß. FPDF arbeitet in mm oder cm (einstellbar), womit das Bild auch in dieser Einheit angegeben werden muss - nicht in Pixel. Da wir aber vorerst gar nicht wissen wie groß unser Bild im cm ist, würde es in der Praxis dann so aussehen.
» PHP
<?php
// PDF in Einheit mm
$img = 'mein_bild.jpg';
$size = GetImageSize($img);
$pdf->Image($img, 20, 20, $size[0] / 72 * 25.4);
// PDF in Einheit cm
$img = 'mein_bild.jpg';
$size = GetImageSize($img);
$pdf->Image($img, 20, 20, $size[0] / 72 * 2.54);
?>
Wir legen also fest, dass unser Bild eine Auflösung von 72dpi hat.
Würde man das so erstellte PDF jetzt ausdrucken, oder auf 200% vergrößern, würden wir feststellen, dass das Resultat nicht die gewünschte Qualltät liefert. Beim vergrößern kommt es zur Pixelbildung, beim drucken sieht es einfach unscharf aus. Dies kann man verhindern, wenn man die Auflösung des Bildes höher setzt - z.B. auf 300dpi.
Aber Moment noch! Das Bild soll ja im PDF nicht optisch größer, und die Breite und Höhe in cm sollen beibehalten werden. Damit das Bild bei 300dpi dies erreicht ($size[0] / 300 * 25.4), muss die Breite und Höhe in Pixel höher gesetzt werden. Sprich, das Bild muss zuerst mit neuer Größe gespeichert werden. In Adobe Photoshop gibt es unter dem Menü ?Bild? -> ?Bildgröße? ein Feld für ?Pixel/Zoll?. Standardwert ist hier meist 72dpi, und dieser Wert wird jetzt einfach auf 300 gesetzt. In anderen Grafikprogrammen sollten ähnliche Funktionen vorhanden sein.
Wird nun DPI auf 300 gesetzt, erhöht sich die Anzahl der Pixel bei Breite und Höhe des Bildes erheblich.
Bild bei 72dpi
Bild bei 300dpi
Wurde das Bild nun neu gespeichert, kann es in FPDF eingebunden werden. Damit FPDF klar gemacht wird, dass es sich um ein 300dpi-Bild handelt, wird das Bild wie folgt eingebunden:
» PHP
<?php
// PDF in Einheit mm
$img = 'mein_bild.jpg';
$size = GetImageSize($img);
$pdf->Image($img, 20, 20, $size[0] / 300 * 25.4);
?>
Hinweis:
FPDF erkennt die Höhe automatisch, wenn hier keine Angabe gemacht wird. Wer dennoch auf sicher gehen möchte, kann das Bild auch so einfügen:
» PHP
<?php
// PDF in Einheit mm
$img = 'mein_bild.jpg';
$size = GetImageSize($img);
$pdf->Image($img, 20, 20, $size[0] / 300 * 25.4, $size[1] / 300 * 25.4);
?>
Ist aber nicht notwendig.
Da unser Bild jetzt wesentlich mehr Punkte pro mm bzw. pro cm hat, ist die Auflösung des Bildes wesentlich besser als vorher. Wird das PDF jetzt vergrößert oder ausgedruckt, sollte der Unterschied klar erkennbar sein.
Beispiel:
http://www.mediacix.de/code/Bild-mit-72dpi-und-600dpi-in-FPDF-einbinden-137-code.html
PHP-GDlib und DPI
Oft wird DPI im Zusammenhang mit der PHP-Programmierung und der GDlib (Grafik-Funktionen von PHP) gebracht.
...
wie kann ich mittels PHP die DPI-Zahl eines JPG-Bildes ermitteln?
...
ich möchte die auflösung (dpi) eines bildes (jpg, gif) auslesen... nur ich finde nirgends eine passende funktion.
...
Die Grafik-Funktionen von PHP arbeiten nur mit Pixel. DPI ist ein Parameter der nicht ausgelesen werden kann, sondern bestimmt wird. Bilder für Webanwendungen sind Pixelbilder und der Monitor stellt nur Pixel dar. Die Auflösung spielt hier erstmal gar keine Rolle.
Auch Verweise auf EXIF-Daten bringt nicht den gewünschten Erfolg. EXIF-Daten sind Informationen z.B. von einer Digitalkamera. Der dort enthaltene Wert ist nur ein Vorschlag :) Und EXIF-Daten gehen verloren, wenn das Bild mit der GDlib bearbeitet wird!
Es gibt allerdings JPEG-Bilder die wirklich einen DPI-Wert gespeichert haben:
» PHP
<?php
$fh = fopen('mein_bild.jpg', 'r');
$header = fread($fh, 16);
fclose ($fh);
$aufloesung = unpack('x14/ndpi', $header);
?>
Aber auch das ist nur ein Vorschlag, wenn das Bild später z.B. ausgedruckt werden soll. Man kann aber mittels GDlib ein Bild auch größer machen.
...
mich würde es interessieren ob es möglich ist mittels imagecreatetruecolor usw. ein Bild zu erzeugen das mehr als 72 dpi hat?
...
Klar, einfach die neue Breite und Höhe in Pixel des Bildes berechnen. Wenn bekannt ist, dass das Bild z.B. bei 320 px Breite und 72dpi etwa 11cm hat (320px / 72 * 2.54), braucht man die Formel nur etwas umstellen.
dpi / 2.54 * cm = pixel
Wollen wir nun 300 dpi haben, dann so:
300 / 2.54 * 11 cm = ca. 1299 px Breite
300 / 2.54 * 8 cm = ca. 945 px Höhe
Mittels der GDlib jetzt einfach das Bild auf diese Größe bringen. Aber! Die GDlib ist kein Bildbearbeitungsprogramm, bei jedem Bearbeitungsprozess leidet die Qualtät darunter.
Also keine Wunder erwarten, wenn das Bild später nicht ganz so schön aussehen sollte.
Fazit
Wenn Bilder für Webanwendungen dargestellt werden sollen sind nur die korrekte Pixelanzahl von Bedeutung. Ich kenne niemand der mit ?Zollstock? ein Bild auf dem Monitor überprüft, ob es genau diese Breite in cm hat oder nicht :)
Auch im Zusammenhang mit Bild-Uploads (z.B. Bildergalerie) wird oft nach DPI gefragt. Auch hier ist es völlig ?Wurst? wenn das Bild nachher nur am Monitor betrachtet wird.
[Änderungen vorbehalten]
neuen Kommentar schreiben
Themen mit ähnlichen Inhalten
Tags zum Beitrag
dpi
aufloesung
php-gdlib
fpdf