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
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:
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.
Die beste Antwort, wenn Sie nur die Breite und Höhe benötigen.
– HartleySan
30. August 15 um 20:15 Uhr
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
.
7844800cookie-checkWie kann ich PNG-Metadaten aus PHP lesen?yes
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 demcomment
Stichwort).– Gumbo
3. Februar 10 um 7:24 Uhr