XMP-Daten ist buchstäblich eingebettet in die image-Datei so extrahieren kann es mit der PHP-string-Funktionen aus der Datei selbst.
Das folgende Beispiel veranschaulicht dieses Verfahren (ich bin mit SimpleXMLaber jede andere XML-API oder sogar eine einfache und clevere string Parsen kann, geben Sie die gleichen Ergebnisse):
XMP macht starken Gebrauch von XML-namespaces, so dass Sie müssen halten ein Auge auf, die beim analysieren von XMP-Daten mit XML-tools.
angesichts der möglichen Größe der Bild-Dateien, Sie werden vielleicht nicht in der Lage sein zu verwenden file_get_contents()da diese Funktion lädt das ganze Bild in den Speicher. Mit fopen() zu öffnen, einen Datei-stream-Ressource und Prüfung von Blöcken von Daten, die für die Schlüssel-Sequenzen <x:xmpmeta und </x:xmpmeta> reduziert deutlich den Speicherbedarf.
Bin ich nur Antworten, nach so viel Zeit, weil das scheint das beste Ergebnis bei der Google-Suche für how to parse XMP-Daten. Ich habe gesehen, dass dieses fast identisch Schnipsel im code verwendet ein paar mal und es ist eine schreckliche Verschwendung von Speicher. Hier ist ein Beispiel für die fopen () - Methode von Stefan erwähnt, nach seinem Beispiel.
Hab ich entwickelte die Xmp Php-Toolkit-Erweiterung : es ist ein php5-Erweiterung basiert auf dem adobe xmp toolkit, welche die wichtigsten Klassen und Methode zum Lesen/schreiben/parse xmp-metadatas von jpeg -, psd -, pdf -, video -, audio - ... Diese Erweiterung ist unter der GNU gpl Lizenz. Eine neue Version wird bald verfügbar sein, für php 5.3 (jetzt nur kompatibel mit php 5.2.x), und sollte auf windows und Mac OS x (jetzt nur für freebsd-und linux-Systemen). http://xmpphptoolkit.sourceforge.net/
Bryan ' s Lösung war die beste bisher, aber es hatte ein paar Probleme, also habe ich es geändert, um es zu vereinfachen, und entfernen Sie einige Funktionen.
Gab es drei Fragen fand ich mit seiner Lösung:
A) Wenn der chunk extrahiert fällt direkt in zwischen eine der Zeichenfolgen, die wir suchen, es nicht finden. Kleinen chunk-Größen sind wahrscheinlicher, um dieses Problem verursachen.
B) Wenn der chunk enthält sowohl den Anfang UND das Ende, es nicht finden. Dies ist einfach zu beheben mit einer zusätzlichen if-Anweisung überprüfen Sie den chunk, den start zu finden ist in um zu sehen, ob am Ende auch gefunden.
C) Die else-Anweisung Hinzugefügt, um das Ende zu brechen, die while-Schleife, wenn es nicht die xmp-Daten hat einen Nebeneffekt, wenn das start-element nicht gefunden auf den ersten pass, es findet keine überprüfung mehr Stücke. Dies ist wahrscheinlich einfach zu beheben, auch, aber mit der ersten Frage lohnt es sich nicht.
Meine Lösung unten ist nicht so mächtig, aber es ist robuster. Es wird nur markieren Sie einen Block, und extrahieren Sie die Daten aus. Es wird nur funktionieren, wenn die start und end sind in das Stück, so die chunk-Größe muss groß genug sein, um sicherzustellen, dass Sie immer erfasst, die Daten. Aus meiner Erfahrung mit Adobe Photoshop/Lightroom exportierten Dateien, die xmp-Daten in der Regel beginnt bei rund 20kB, und endet bei etwa 45kB. Mein chunk-Größe von 50k scheint zu funktionieren gut für meine Bilder, es wäre viel weniger, wenn Sie Streifen einige der Daten zu exportieren, wie die CRS-block, hat eine Menge von Einstellungen entwickeln.
function getXmpData($filename){
$chunk_size =50000;
$buffer = NULL;if(($file_pointer = fopen($filename,'r'))=== FALSE){thrownewRuntimeException('Could not open file for reading');}
$chunk = fread($file_pointer, $chunk_size);if(($posStart = strpos($chunk,'<x:xmpmeta'))!== FALSE){
$buffer = substr($chunk, $posStart);
$posEnd = strpos($buffer,'</x:xmpmeta>');
$buffer = substr($buffer,0, $posEnd +12);}
fclose($file_pointer);return $buffer;}
Danke Sebastien B. für die verkürzte version :). Wenn Sie wollen, um das problem zu vermeiden, wenn chunk_size ist einfach zu klein für einige Dateien, fügen Sie einfach die Rekursion.
Wenn Sie ExifTool zur Verfügung (sehr nützlich) und können externe Kommandos auszuführen, können Sie es verwenden, ist die option für das extrahieren von XMP-Daten (-xmp:all) und die Ausgabe im JSON-format (-json), die kann man dann problemlos konvertieren, um ein PHP-Objekt:
XMP-Daten ist buchstäblich eingebettet in die image-Datei so extrahieren kann es mit der PHP-string-Funktionen aus der Datei selbst.
Das folgende Beispiel veranschaulicht dieses Verfahren (ich bin mit SimpleXMLaber jede andere XML-API oder sogar eine einfache und clevere string Parsen kann, geben Sie die gleichen Ergebnisse):
Nur zwei Bemerkungen:
file_get_contents()
da diese Funktion lädt das ganze Bild in den Speicher. Mitfopen()
zu öffnen, einen Datei-stream-Ressource und Prüfung von Blöcken von Daten, die für die Schlüssel-Sequenzen<x:xmpmeta
und</x:xmpmeta>
reduziert deutlich den Speicherbedarf.InformationsquelleAutor der Antwort Stefan Gehrig
Bin ich nur Antworten, nach so viel Zeit, weil das scheint das beste Ergebnis bei der Google-Suche für how to parse XMP-Daten. Ich habe gesehen, dass dieses fast identisch Schnipsel im code verwendet ein paar mal und es ist eine schreckliche Verschwendung von Speicher. Hier ist ein Beispiel für die fopen () - Methode von Stefan erwähnt, nach seinem Beispiel.
InformationsquelleAutor der Antwort Bryan Geraghty
Einen einfachen Weg unter linux ist der Aufruf der exiv2-Programm zur Verfügung in einem gleichnamigen Paket auf debian.
produzieren Bild.xmp mit eingebetteten XMP-was ist Ihnen jetzt zu analysieren.
InformationsquelleAutor der Antwort Fluxine
Hab ich entwickelte die Xmp Php-Toolkit-Erweiterung : es ist ein php5-Erweiterung basiert auf dem adobe xmp toolkit, welche die wichtigsten Klassen und Methode zum Lesen/schreiben/parse xmp-metadatas von jpeg -, psd -, pdf -, video -, audio - ... Diese Erweiterung ist unter der GNU gpl Lizenz. Eine neue Version wird bald verfügbar sein, für php 5.3 (jetzt nur kompatibel mit php 5.2.x), und sollte auf windows und Mac OS x (jetzt nur für freebsd-und linux-Systemen).
http://xmpphptoolkit.sourceforge.net/
InformationsquelleAutor der Antwort Mathias Vitalis
Bryan ' s Lösung war die beste bisher, aber es hatte ein paar Probleme, also habe ich es geändert, um es zu vereinfachen, und entfernen Sie einige Funktionen.
Gab es drei Fragen fand ich mit seiner Lösung:
A) Wenn der chunk extrahiert fällt direkt in zwischen eine der Zeichenfolgen, die wir suchen, es nicht finden. Kleinen chunk-Größen sind wahrscheinlicher, um dieses Problem verursachen.
B) Wenn der chunk enthält sowohl den Anfang UND das Ende, es nicht finden. Dies ist einfach zu beheben mit einer zusätzlichen if-Anweisung überprüfen Sie den chunk, den start zu finden ist in um zu sehen, ob am Ende auch gefunden.
C) Die else-Anweisung Hinzugefügt, um das Ende zu brechen, die while-Schleife, wenn es nicht die xmp-Daten hat einen Nebeneffekt, wenn das start-element nicht gefunden auf den ersten pass, es findet keine überprüfung mehr Stücke. Dies ist wahrscheinlich einfach zu beheben, auch, aber mit der ersten Frage lohnt es sich nicht.
Meine Lösung unten ist nicht so mächtig, aber es ist robuster. Es wird nur markieren Sie einen Block, und extrahieren Sie die Daten aus. Es wird nur funktionieren, wenn die start und end sind in das Stück, so die chunk-Größe muss groß genug sein, um sicherzustellen, dass Sie immer erfasst, die Daten. Aus meiner Erfahrung mit Adobe Photoshop/Lightroom exportierten Dateien, die xmp-Daten in der Regel beginnt bei rund 20kB, und endet bei etwa 45kB. Mein chunk-Größe von 50k scheint zu funktionieren gut für meine Bilder, es wäre viel weniger, wenn Sie Streifen einige der Daten zu exportieren, wie die CRS-block, hat eine Menge von Einstellungen entwickeln.
InformationsquelleAutor der Antwort Sebastien B.
Danke Sebastien B. für die verkürzte version :). Wenn Sie wollen, um das problem zu vermeiden, wenn chunk_size ist einfach zu klein für einige Dateien, fügen Sie einfach die Rekursion.
InformationsquelleAutor der Antwort Lukáš Řádek
Wenn Sie ExifTool zur Verfügung (sehr nützlich) und können externe Kommandos auszuführen, können Sie es verwenden, ist die option für das extrahieren von XMP-Daten (
-xmp:all
) und die Ausgabe im JSON-format (-json
), die kann man dann problemlos konvertieren, um ein PHP-Objekt:InformationsquelleAutor der Antwort Liam