Finden Sie JPEG-Auflösung mit PHP


Answers

Es gibt zwei Orte, an denen eine Auflösung (dh die Auflösung des JPEG, wenn gedruckt wird, auch kurz als DPI oder Punkte pro Zoll bezeichnet) möglicherweise gespeichert werden kann.

Der erste befindet sich im JPEG-JFIF-Header, der oft (aber nicht immer) direkt am Anfang des JPEGs steht.

Der andere ist in den EXIF-Daten.

Beachten Sie, dass Auflösungsdaten normalerweise NICHT vorhanden sind, da sie nur dann eine Bedeutung haben, wenn sie mit einer physischen Ausgabegröße verknüpft sind. Wenn beispielsweise eine Digitalkamera den Wert schreibt, ist dies normalerweise bedeutungslos. Wenn das JPEG jedoch an einen Drucker ausgegeben wird (z. B.), hat der Wert eine Bedeutung.

Hier ist ein Code, um ihn aus dem JFIF-Header zu holen, vorausgesetzt, dass einer vorhanden ist und sich in einem APP0-Chunk befindet, der der zweite Chunk in der Datei ist. (Der erste Chunk ist immer der SOI-Marker.):

function read_JFIF_dpi($filename)
{
    $dpi = 0;
    $fp = @fopen($filename, r);
    if ($fp) {
        if (fseek($fp, 6) == 0) { // JFIF often (but not always) starts at offset 6.
            if (($bytes = fread($fp, 16)) !== false) { // JFIF header is 16 bytes.
                if (substr($bytes, 0, 4) == "JFIF") { // Make sure it is JFIF header.
                    $JFIF_density_unit = ord($bytes[7]);
                    $JFIF_X_density = ord($bytes[8])*256 + ord($bytes[9]); // Read big-endian unsigned short int.
                    $JFIF_Y_density = ord($bytes[10])*256 + ord($bytes[11]); // Read big-endian unsigned short int.
                    if ($JFIF_X_density == $JFIF_Y_density) { // Assuming we're only interested in JPEGs with square pixels.
                        if ($JFIF_density_unit == 1) $dpi = $JFIF_X_density; // Inches.
                        else if ($JFIF_density_unit == 2) $dpi = $JFIF_X_density * 2.54; // Centimeters.
                    }
                }
            }
        }
        fclose($fp);
    }
    return ($dpi);
}
Question

Alle PHP-Gurus anrufen!

Ich verstehe, dass Sie getimagesize () verwenden können, um die tatsächliche Pixelhöhe und -breite eines Bildes in PHP zu erhalten. Wenn Sie jedoch ein Bild in Photoshop öffnen und den Bildgrößendialog sehen, stellen Sie fest, dass ein Auflösungswert die Druckgröße des Bildes bestimmt.

Bei einer beliebigen JPG-Bilddatei muss ich PHP verwenden, um diese Auflösungsnummer zu bestimmen. Es scheint, dass diese Informationen irgendwo in der jpg-Datei gespeichert sind, also wie komme ich dorthin?

Eine weitere Voraussetzung - ich habe nur gdlib zur Verfügung. Ich muss dies ohne die Verwendung anderer PHP-Bibliotheken tun (imagemagick, etc.)

Danke für die Hilfe!




Ich verstehe das nicht. Pixel = Druckgröße x Auflösung, und die Anzahl der Pixel ist ein festgelegter Wert. Also, wenn Sie ein Bild von 300x300 Pixel haben, haben Sie 1 "x1" von 300 DPI Auflösung, 2 "x2" von 150 DPI Auflösung oder 4 "x4" von 75 DPI Auflösung usw. Ein Bild hat keine Auflösung es sei denn, es hat eine physikalische Größe, um mit seiner Pixelgröße zu vergleichen.

Was fehlt mir? (Und wie offensichtlich ist es für alle anderen? =))