Wie kann ich PNG-Metadaten aus PHP lesen?

Lesezeit: 4 Minuten

Wie kann ich PNG Metadaten aus PHP lesen
USDoD14

Das habe ich bisher:

<?php

$file = "18201010338AM16390621000846.png";

$test = file_get_contents($file, FILE_BINARY);

echo str_replace("n","<br>",$test);

?>

Die Ausgabe ist irgendwie das, was ich will, aber ich brauche wirklich nur die Zeilen 3-7 (einschließlich). So sieht die Ausgabe jetzt aus: http://silentnoobs.com/pbss/collector/test.php. Ich versuche, die Daten von “PunkBuster Screenshot (±) AAO Bridge Crossing” zu “Ergebnis: w=394 X h=196 sample=2” zu bekommen. Ich denke, es wäre ziemlich einfach, die Datei durchzulesen und jede Zeile in einem Array, Zeile, zu speichern[0] müsste “PunkBuster Screenshot (±) AAO Bridge Crossing” sein, und so weiter. Alle diese Linien können sich ändern, also kann ich nicht einfach nach etwas Endlichem suchen.

Ich habe es jetzt ein paar Tage lang versucht, und es hilft nicht viel, dass ich schlecht in PHP bin.

  • Entschuldigung, ich verstehe weder das Ziel noch die Frage …

    – verzeihen

    3. Februar 10 um 7:11 Uhr

  • PNG ist in Chunks unterteilt (libpng.org/pub/png/spec/1.2/PNG-Chunks.html). Und Sie suchen wahrscheinlich nach dem tEXt Chunk, der einen Kommentar enthält (gekennzeichnet mit dem comment Stichwort).

    – Gumbo

    3. Februar 10 um 7:24 Uhr

Wie kann ich PNG Metadaten aus PHP lesen
Andreas Moore

Der PNG-Dateiformat definiert, dass ein PNG-Dokument in mehrere Datenblöcke aufgeteilt wird. Sie müssen sich also zu dem gewünschten Chunk navigieren.

Die Daten, die Sie extrahieren möchten, scheinen in a definiert zu sein tEXt Stück. Ich habe die folgende Klasse geschrieben, damit Sie Chunks aus PNG-Dateien extrahieren können.

class PNG_Reader
{
    private $_chunks;
    private $_fp;

    function __construct($file) {
        if (!file_exists($file)) {
            throw new Exception('File does not exist');
        }

        $this->_chunks = array ();

        // Open the file
        $this->_fp = fopen($file, 'r');

        if (!$this->_fp)
            throw new Exception('Unable to open file');

        // Read the magic bytes and verify
        $header = fread($this->_fp, 8);

        if ($header != "x89PNGx0dx0ax1ax0a")
            throw new Exception('Is not a valid PNG image');

        // Loop through the chunks. Byte 0-3 is length, Byte 4-7 is type
        $chunkHeader = fread($this->_fp, 8);

        while ($chunkHeader) {
            // Extract length and type from binary data
            $chunk = @unpack('Nsize/a4type', $chunkHeader);

            // Store position into internal array
            if ($this->_chunks[$chunk['type']] === null)
                $this->_chunks[$chunk['type']] = array ();
            $this->_chunks[$chunk['type']][] = array (
                'offset' => ftell($this->_fp),
                'size' => $chunk['size']
            );

            // Skip to next chunk (over body and CRC)
            fseek($this->_fp, $chunk['size'] + 4, SEEK_CUR);

            // Read next chunk header
            $chunkHeader = fread($this->_fp, 8);
        }
    }

    function __destruct() { fclose($this->_fp); }

    // Returns all chunks of said type
    public function get_chunks($type) {
        if ($this->_chunks[$type] === null)
            return null;

        $chunks = array ();

        foreach ($this->_chunks[$type] as $chunk) {
            if ($chunk['size'] > 0) {
                fseek($this->_fp, $chunk['offset'], SEEK_SET);
                $chunks[] = fread($this->_fp, $chunk['size']);
            } else {
                $chunks[] = '';
            }
        }

        return $chunks;
    }
}

Sie können es als solches verwenden, um Ihre gewünschte zu extrahieren tEXt Stück als solches:

$file="18201010338AM16390621000846.png";
$png = new PNG_Reader($file);

$rawTextData = $png->get_chunks('tEXt');

$metadata = array();

foreach($rawTextData as $data) {
   $sections = explode("", $data);

   if($sections > 1) {
       $key = array_shift($sections);
       $metadata[$key] = implode("", $sections);
   } else {
       $metadata[] = $data;
   }
}

  • Wenn er nur tEXt-Chunks benötigt, ist es eine Speicherverschwendung, die gesamten PNG-Daten (dh fread vs fseek).

    – Matthew

    3. Februar 10 um 8:03 Uhr

  • @konforce: Ich habe die Klasse umgestaltet, um nur Offsets von Chunks zu speichern. Sie werden nutzungsabhängig gelesen. Ich möchte die obige Klasse so vielseitig wie möglich halten.

    – Andrew Moore

    3. Februar 10 um 8:23 Uhr


<?php
  $fp = fopen('18201010338AM16390621000846.png', 'rb');
  $sig = fread($fp, 8);
  if ($sig != "x89PNGx0dx0ax1ax0a")
  {
    print "Not a PNG image";
    fclose($fp);
    die();
  }

  while (!feof($fp))
  {
    $data = unpack('Nlength/a4type', fread($fp, 8));
    if ($data['type'] == 'IEND') break;

    if ($data['type'] == 'tEXt')
    {
       list($key, $val) = explode("", fread($fp, $data['length']));
       echo "<h1>$key</h1>";
       echo nl2br($val);

       fseek($fp, 4, SEEK_CUR);
    }
    else
    {
       fseek($fp, $data['length'] + 4, SEEK_CUR);
    }
  }


  fclose($fp);
?>

Es geht von einer grundsätzlich wohlgeformten PNG-Datei aus.

Wie wäre es mit:

http://www.php.net/manual/en/function.getimagesize.php

  • Die beste Antwort, wenn Sie nur die Breite und Höhe benötigen.

    – HartleySan

    30. August 15 um 20:15 Uhr

1644072905 966 Wie kann ich PNG Metadaten aus PHP lesen
Josef

Ich habe dieses Problem vor ein paar Tagen festgestellt, also habe ich eine Bibliothek erstellt, um die Metadaten (Exif, XMP und GPS) eines PNG in PHP zu extrahieren, 100% nativ, ich hoffe, es hilft. 🙂 PNGMetadaten

Geben Sie hier die Bildbeschreibung ein

.

784480cookie-checkWie kann ich PNG-Metadaten aus PHP lesen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy