Signatur
Beschreibung
iptcembed() nimmt rohe IPTC-Binärdaten und bettet diese in eine vorhandene JPEG-Datei ein. IPTC (International Press Telecommunications Council) ist ein weit verbreiteter Standard zum Speichern von Metadaten wie Bildtitel, Beschreibung, Autor, Schlüsselwörter und Urheberrechtsinformationen direkt in Bilddateien.
Die Funktion liest die angegebene JPEG-Datei, fügt die IPTC-Daten als APP13-Marker-Segment ein und gibt das Ergebnis zurück. Je nach Wert des Parameters spool wird das Ergebnis entweder als Binär-String zurückgegeben oder direkt an den Browser ausgegeben.
Um die IPTC-Daten im korrekten Binärformat zu erstellen, wird typischerweise die Funktion iptcparse() zum Lesen und manuell aufgebaute Bytesequenzen (gemäß IPTC-Spezifikation) zum Schreiben genutzt. Die einzelnen IPTC-Felder werden als so genannte Dataset-Records mit Record-Nummer 2 und einem spezifischen Tag-Code codiert.
Diese Funktion ist besonders nützlich, wenn Bilder programmatisch mit Metadaten angereichert werden sollen, z. B. beim automatischen Export aus einem CMS oder beim Batch-Tagging von Pressefotos.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $iptcdata Pflicht | string | Die rohen IPTC-Binärdaten, die in das Bild eingebettet werden sollen. Diese müssen im korrekten IPTC-Binärformat (8BIM-Segment) vorliegen, wie es z. B. durch manuelle Konstruktion gemäß IPTC-Standard erzeugt wird. | |
| $filename Pflicht | string | Pfad zur vorhandenen JPEG-Datei, in die die IPTC-Daten eingebettet werden sollen. | |
| $spool | int | 0 | Steuerung der Ausgabe: 0 (Standard) gibt das Ergebnis als Binär-String zurück; 1 gibt das Bild direkt an den Browser aus (mit passenden HTTP-Headern); 2 gibt das Bild als Base64-codierten String zurück. |
Rückgabewert
spool = 0 wird das resultierende Bild als Binär-String zurückgegeben. Bei spool = 2 wird ein Base64-codierter String zurückgegeben. Bei spool = 1 wird das Bild direkt ausgegeben und true zurückgegeben. Im Fehlerfall wird false zurückgegeben.Beispiele
IPTC-Metadaten in ein JPEG einbetten und speichern
<?php
// IPTC-Daten manuell als Binärstring aufbauen
function iptcMakeTag(int $rec, int $data, string $value): string
{
$length = strlen($value);
return chr(0x1C) . chr($rec) . chr($data) . chr($length >> 8) . chr($length & 0xFF) . $value;
}
// Bildtitel (Tag 2:005) und Beschreibung (Tag 2:120) setzen
$iptcData = iptcMakeTag(2, 5, 'Mein Bildtitel');
$iptcData .= iptcMakeTag(2, 120, 'Eine ausführliche Bildbeschreibung');
$iptcData .= iptcMakeTag(2, 80, 'Max Mustermann'); // Fotograf (Tag 2:080)
// 8BIM-Wrapper für Photoshop-IPTC-Block
$data = "8BIM" . chr(0x04) . chr(0x04);
$data .= chr(0) . chr(0); // Padding (leer)
$paddedLength = strlen($iptcData) % 2 !== 0 ? strlen($iptcData) + 1 : strlen($iptcData);
$data .= chr($paddedLength >> 24) . chr(($paddedLength >> 16) & 0xFF)
. chr(($paddedLength >> 8) & 0xFF) . chr($paddedLength & 0xFF);
$data .= $iptcData;
if (strlen($iptcData) % 2 !== 0) {
$data .= chr(0); // Padding auf gerade Länge
}
$sourceFile = '/var/www/bilder/original.jpg';
$result = iptcembed($data, $sourceFile, 0);
if ($result !== false) {
file_put_contents('/var/www/bilder/mit_iptc.jpg', $result);
echo 'Bild mit IPTC-Metadaten gespeichert.';
} else {
echo 'Fehler beim Einbetten der IPTC-Daten.';
}
IPTC-Daten aus Bild lesen, erweitern und zurückschreiben
<?php
$sourceFile = '/var/www/bilder/foto.jpg';
// Vorhandene IPTC-Daten lesen
$size = [];
getimagesize($sourceFile, $info);
$existingIptc = isset($info['APP13']) ? iptcparse($info['APP13']) : [];
// Schlüsselwörter (Tag 2:025) hinzufügen
function iptcMakeTag(int $rec, int $data, string $value): string
{
$len = strlen($value);
return chr(0x1C) . chr($rec) . chr($data) . chr($len >> 8) . chr($len & 0xFF) . $value;
}
$newData = iptcMakeTag(2, 25, 'PHP');
$newData .= iptcMakeTag(2, 25, 'Programmierung');
$wrappedData = "8BIM" . chr(0x04) . chr(0x04) . chr(0) . chr(0);
$len = strlen($newData);
if ($len % 2 !== 0) { $newData .= chr(0); $len++; }
$wrappedData .= chr($len >> 24) . chr(($len >> 16) & 0xFF)
. chr(($len >> 8) & 0xFF) . chr($len & 0xFF);
$wrappedData .= $newData;
$result = iptcembed($wrappedData, $sourceFile, 0);
if ($result !== false) {
file_put_contents($sourceFile, $result);
echo 'Schlüsselwörter erfolgreich eingebettet.';
}
// Wichtig · Fallstricke
Nur JPEG: iptcembed() funktioniert ausschließlich mit JPEG-Bildern. PNG, GIF oder andere Formate werden nicht unterstützt.
Überschreiben bestehender Daten: Wenn bereits ein APP13-Segment im Bild vorhanden ist, kann es beim Einbetten neuer Daten zu Konflikten oder doppelten Segmenten kommen. Es empfiehlt sich daher, bestehende IPTC-Daten vorher mit iptcparse() auszulesen und vollständig neu zu schreiben.
Dateiformat der IPTC-Daten: Die Binärdaten müssen exakt dem Photoshop-8BIM-Format entsprechen. Fehlerhafte Strukturen können dazu führen, dass das Bild nicht mehr korrekt gelesen werden kann.
Alternativ: Für komplexere Metadaten-Operationen (z. B. EXIF + IPTC + XMP kombiniert) empfiehlt sich der Einsatz externer Bibliotheken wie PHP-Exif oder Kommandozeilen-Tools wie ExifTool.