PNG: Druckgröße (DPI) abspeichern mit PHP
01.02.2010 16:49 von webdecker
Die PHP-Funktion imagepng() speichert keine Information zur Druckgröße in der resultierenden PNG-Datei (keine Angabe über Auflösung bzw. Druckgröße in DPI/dots per inch oder cm). Hier eine mögliche Lösung.
Die folgende Methode schreibt in die Ausgabe von PHP noch die entsprechende Information hinein.
Die folgende Methode schreibt in die Ausgabe von PHP noch die entsprechende Information hinein.
<?php
/** Writes png image file with given dpi resolution information
* (since php's imagepng() function does not do it).
* Returns png as byte string. If filename is given, data is written to file and the method
* returns the number of bytes written or FALSE if error.
*
* @param $image Image resource
* @param $dpi dots per inch value for horizontal and vertical resolution
* @param $compression [0..9], 0 = lossless, 9 = maximum compression
* @param $filename optional filename and if given the png is writte to file
*/
public function writePng($image, $dpi, $compression = 0, $filename = null) {
$dpm = $dpi / 0.0254;
// Let php write the png file...
ob_start();
imagepng($image, NULL, $compression, NULL);
$content = ob_get_clean();
// Split result to get a slot to insert our pHYs chunk...
list($first, $second) = explode('IDAT', $content, 2);
// This way we split the IDAT chunk between its length and type code,
// so we have to repair it...
$idatlen = substr($first, strlen($first)-4, 4);
$first = substr($first, 0, strlen($first)-4);
$second = $idatlen . 'IDAT' . $second;
// Now create pHYs chunk and insert...
$data = pack('N', $dpm) . pack('N', $dpm) . chr(1);
$len = pack('N', strlen($data));
$type = 'pHYs';
$phys = $len . $type . $data . pack('N', crc32($type . $data));
$content = $first . $phys . $second;
if ($filename) {
// Save / store file...
return file_put_contents($filename, $content);
}
return $content;
}
?>
Einen Kommentar schreiben