Aktueller Standort: Startseite> Neueste Artikel> PNG -Datei -Header: Pack () + Dateistrukturanalyse

PNG -Datei -Header: Pack () + Dateistrukturanalyse

M66 2025-05-28

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.

1. Überblick über die PNG -Dateistruktur

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)

2. Verwenden Sie PHP, um PNG -Dateiheader analysieren zu können

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";
?>

3.. Schlüsselfunktionen Beschreibung

auspacken()

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

Pack()

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.

4. Fortgeschrittene Analyse

Um nachfolgende PNG -Blöcke (z. B. IDAT, Iend usw.) weiter zu analysieren, schleifen Sie einfach jeden Block wie folgt durch:

  1. Lesen Sie 8 Bytes: 4 Bytelänge + 4 Byte -Typ

  2. Lesen Sie das entsprechende Datenfeld gemäß der Länge

  3. Überspringen Sie 4 Byte CRC Check

  4. 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.

V. Schlussfolgerung

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.