PNG: Druckgröße (DPI) abspeichern mit PHP
(Kommentare: 0)
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.
<?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 */ 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; } ?>
Kommentare
Einen Kommentar schreiben