Im Bereich der Bildverarbeitung ist PNG (tragbare Netzwerkgrafiken) ein weit verbreitetes, verlustfreies komprimiertes Bildformat. Die Dateistruktur enthält klare Spezifikationen, einschließlich mehrerer "Stücke", die jeweils spezifisches Bild- oder Metadateninformationen enthalten. Das Verständnis dieser Strukturen trägt nicht nur dazu bei, benutzerdefinierte Image -Verarbeitungswerkzeuge zu entwickeln, sondern kann auch für das Lernen von Binärdatenoperationen und das Protokolldesign von großem Nutzen sein.
In diesem Artikel wird der Header der PNG -Datei manuell über PHP ( Pack () und pack () Funktionen analysiert und seine Struktur analysiert. Obwohl PHP eine webbasierte Sprache ist, verfügt es auch über hervorragende Fähigkeiten bei der Verarbeitung von Binärdaten.
Eine legale PNG -Datei muss mit einer 8 -Byte -festen Unterschrift beginnen:
89 50 4E 47 0D 0A 1A 0A
Als nächstes kommt ein oder mehrere Blöcke (Chunk), von denen jedes aus den folgenden Teilen besteht:
Länge (4 Bytes) - Länge des Datenteils
Blocktyp (4 Bytes) - wie IHDR, IDAT, Iend usw.
Blockdaten (Variable)
CRC -Überprüfung (4 Bytes)
Der folgende Beispielcode liest die ersten mehrere Bytes einer PNG -Datei und extrahiert den Dateiheader und den ersten Block (normalerweise IHDR).
<?php
$filename = 'https://m66.net/sample.png';
// Vor dem Lesen der Datei 33 Byte:8 ByteZeichen + 4+4+13+4(IHDR Gesamtblocklänge)
$data = file_get_contents($filename, false, null, 0, 33);
if ($data === false || strlen($data) < 33) {
die("Nicht lesen PNG Datei oder Datei zu klein。");
}
// Analyse PNG Zeichen
$signature = substr($data, 0, 8);
$expectedSignature = "\x89PNG\r\n\x1a\n";
if ($signature !== $expectedSignature) {
die("Dies ist keine gültige PNG dokumentieren。");
}
echo "PNG Zeichen验证成功。\n";
// Analyse第一个 Chunk(Sollte sein IHDR)
$chunkData = substr($data, 8);
// verwenden unpack Felder extrahieren
$unpacked = unpack("Nlength/A4type", substr($chunkData, 0, 8));
$length = $unpacked['length'];
$type = $unpacked['type'];
echo "Der erste Blocktyp: $type\n";
echo "Datenlänge: $length\n";
// Extrakt IHDR Daten
$ihdrData = substr($chunkData, 8, 13);
$ihdr = unpack("Nwidth/Nheight/CbitDepth/CcolorType/Ccompression/Cfilter/Cinterlace", $ihdrData);
echo "Breite: {$ihdr['width']} px\n";
echo "hoch: {$ihdr['height']} px\n";
echo "Tief: {$ihdr['bitDepth']}\n";
echo "Farbtyp: {$ihdr['colorType']}\n";
echo "Komprimierungsmethode: {$ihdr['compression']}\n";
echo "Filtermethode: {$ihdr['filter']}\n";
echo "Interlaced Scan: {$ihdr['interlace']}\n";
?>
pack () wird verwendet, um Binärdaten in PHP -Arrays zu analysieren. Es wird eine Formatzeichenfolge verwendet, um den Typ und die Reihenfolge jedes Feldes zu beschreiben. Zum Beispiel:
unpack("Nlength/A4type", $binary);
NLength bedeutet, eine nicht signierte Langgülle (4 Bytes) mit dem Namen Länge zu lesen
A4Type bedeutet, eine ASCII
Stattdessen kann Pack () Variablen in ein Binärformat verpacken. Wenn Sie beispielsweise PNG -Datei -Header mit PNG -Dateiverpackungen verpacken, können Sie:
$signature = pack("C8", 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A);
Dies ist sehr nützlich, wenn Sie die Generierung von PNG -Dateien anpassen.
Um nachfolgende PNG -Blöcke (z. B. IDAT, Iend usw.) weiter zu analysieren, schleifen Sie einfach jeden Block wie folgt durch:
Lesen Sie 8 Bytes: 4 Bytelänge + 4 Byte -Typ
Lesen Sie das entsprechende Datenfeld gemäß der Länge
Überspringen Sie 4 Byte CRC Check
Lesen Sie den nächsten Block fort, bis Iend auftritt
Diese Analysemethode kann auch auf komplexere PNG -Eigenschaften wie Transparenz (TRNs), Farbpalette (PLTE) und andere Blöcke angewendet werden.
Durch die Verwendung von PHP-Funktionen von PHP () und Pack () können wir PNG-Dateien problemlos auf niedriger Weise analysieren und ihre zugrunde liegende Struktur verstehen. Diese Fähigkeit ist sehr nützlich, um ein detailliertes Verständnis von Bildformaten, das Schreiben von maßgeschneiderten Bildverarbeitungstools oder die Entwicklung verwandter Sicherheitstools zu schreiben. Wenn Sie diese Fähigkeiten beherrschen, können Sie sich auch in der täglichen PHP -Entwicklung wohler machen.