Position actuelle: Accueil> Derniers articles> En-tête de fichier PNG: pack () + analyse de structure de fichiers

En-tête de fichier PNG: pack () + analyse de structure de fichiers

M66 2025-05-28

Dans le domaine du traitement d'image, PNG (Portable Network Graphics) est un format d'image comprimé sans perte largement utilisé. Sa structure de fichiers a des spécifications claires, y compris plusieurs "morceaux", chacun contenant des informations spécifiques d'image ou de métadonnées. La compréhension de ces structures aide non seulement à développer des outils de traitement d'image personnalisés, mais peut également être très avantageux pour apprendre les opérations de données binaires et la conception du protocole.

Cet article analysera manuellement l'en-tête du fichier PNG via les fonctions de PHP Pack () et Deteback () et analysera sa structure. Bien que PHP soit une langue basée sur le Web, il a également d'excellentes capacités dans le traitement des données binaires.

1. Présentation de la structure des fichiers PNG

Un fichier PNG légal doit commencer par une signature fixe de 8 octets:

 89 50 4E 47 0D 0A 1A 0A

Ensuite, c'est un ou plusieurs blocs (morceau), dont chacun se compose des parties suivantes:

  • Longueur (4 octets) - longueur de la partie de données

  • Type de bloc (4 octets) - comme IHDR, idat, iend, etc.

  • Bloquer les données (variable)

  • Vérification CRC (4 octets)

2. Utilisez PHP pour analyser les en-têtes de fichiers PNG

L'exemple de code suivant lira les premiers octets d'un fichier PNG, en extraction de l'en-tête de fichier et du premier bloc (généralement IHDR).

 <?php
$filename = 'https://m66.net/sample.png';

// Avant de lire le fichier 33 octet:8 octetsigne + 4+4+13+4(IHDR Longueur totale du bloc)
$data = file_get_contents($filename, false, null, 0, 33);

if ($data === false || strlen($data) < 33) {
    die("Impossible de lire PNG Fichier ou fichier trop petit。");
}

// Analyse PNG signe
$signature = substr($data, 0, 8);
$expectedSignature = "\x89PNG\r\n\x1a\n";

if ($signature !== $expectedSignature) {
    die("Ce n&#39;est pas un PNG document。");
}

echo "PNG signe验证成功。\n";

// Analyse第一个 Chunk(Devrait être IHDR)
$chunkData = substr($data, 8);

// utiliser unpack Extraire les champs
$unpacked = unpack("Nlength/A4type", substr($chunkData, 0, 8));
$length = $unpacked['length'];
$type = $unpacked['type'];

echo "Le premier type de bloc: $type\n";
echo "Durée des données: $length\n";

// extrait IHDR données
$ihdrData = substr($chunkData, 8, 13);

$ihdr = unpack("Nwidth/Nheight/CbitDepth/CcolorType/Ccompression/Cfilter/Cinterlace", $ihdrData);

echo "largeur: {$ihdr['width']} px\n";
echo "haut: {$ihdr['height']} px\n";
echo "Profond: {$ihdr['bitDepth']}\n";
echo "Type de couleur: {$ihdr['colorType']}\n";
echo "Méthode de compression: {$ihdr['compression']}\n";
echo "Méthode de filtre: {$ihdr['filter']}\n";
echo "Scan entrelacé: {$ihdr['interlace']}\n";
?>

3. Description des fonctions clés

déballer()

Unpack () est utilisé pour analyser les données binaires dans les tableaux PHP. Il utilise une chaîne de format pour décrire le type et l'ordre de chaque champ. Par exemple:

 unpack("Nlength/A4type", $binary);
  • NLength signifie lire un entier long non signé grand-endian (4 octets), nommé longueur

  • A4Type signifie lire une chaîne ASCII de longueur fixe (4 octets) nommé type

paquet()

Au lieu de cela, Pack () peut emballer les variables au format binaire. Par exemple, lors de l'emballage des en-têtes de fichiers PNG, vous pouvez utiliser:

 $signature = pack("C8", 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A);

Ceci est très utile lors de la personnalisation de la génération de fichiers PNG.

4. Analyse avancée

Pour continuer à analyser les blocs PNG ultérieurs (tels que IDAT, iend, etc.), il suffit de faire une boucle dans chaque bloc comme suit:

  1. Lire 8 octets: 4 octets Longueur + 4 octets Type

  2. Lisez le champ de données correspondant en fonction de la longueur

  3. Skip 4 octets CRC Vérifier

  4. Continuez à lire le bloc suivant jusqu'à ce que iend soit rencontré

Cette méthode d'analyse peut également être appliquée aux caractéristiques PNG plus complexes, telles que la transparence (TRN), la palette de couleurs (PLTE) et d'autres blocs.

V. Conclusion

En utilisant les fonctions de déball () et de pack () de PHP, nous pouvons facilement analyser les fichiers PNG de faible niveau et comprendre leur structure sous-jacente. Cette compétence est très utile pour une compréhension approfondie des formats d'image, en écrivant des outils de traitement d'image personnalisés ou en développant des outils de sécurité connexes. La maîtrise de ces compétences peut également vous rendre plus à l'aise dans le développement quotidien de PHP.

  • Étiquettes associées:

    PNG