2011-03-21 4 views
12

J'essaie de créer un site Web où je peux ajouter et modifier des métadonnées dans un fichier JPEG.écrire des données exif dans php

Existe-t-il un moyen d'écrire les données exif de manière assez simple?

J'ai vu un ou deux exemples, mais ils sont trop complexes à comprendre dans le temps qui m'est imparti.

Je connais IPTC et je sais que les métadonnées peuvent être ajoutées au fichier JPEG. Mais quelle serait la bonne façon de faire cela?

Si quelqu'un pouvait vous aider à ajouter des métadonnées au format JPEG en utilisant EXIF ​​ou IPTC ou toute autre bibliothèque ou fonctionnalité de PHP, je serais très reconnaissant.

Mise à jour:

d'abord merci pour la réponse dbers.

J'ai regardé le code. J'ai réussi à l'obtenir pour ajouter les balises par défaut dans le JPG.

Je suis encore un peu confus quant à ce que signifient les petites parties du code.

Par exemple l'écriture de données exif dans la fonction php:

function iptc_make_tag($rec, $data, $value) 
{ 
    $length = strlen($value); 
    $retval = chr(0x1C) . chr($rec) . chr($data); 
    ... 
} 

Je ne suis pas venu dans une variable de fonction, et comment sont-$rec, $data et $value référencé si elles havent définies. Ou sont-ils pris de iptc_make_tag?

J'ai renvoyé $rec et $value mais je n'ai pas de valeur à l'écran.

if(isset($info['APP13'])) 

Je ne suis pas sûr de ce que signifie APP13 et lorsque je tente de faire écho à $info, je reçois juste le suivant quand je fais écho à $info dans une table.

 
'2#120' => 'Test image', 
'2#116' => 'Copyright 2008-2009, The PHP Group' 

Répondre

3

Je n'ai aucune expérience avec moi-même, mais le site Web de php a quelque chose qui ressemble à ce que vous cherchez:

http://php.net/manual/en/function.iptcembed.php

Si c'est ce que vous vouliez dire lorsque vous avez dit « Je J'ai vu un ou deux exemples, mais ils sont trop complexes à comprendre dans le temps qui m'est imparti. "

Alors vous pourriez être dans au-dessus de votre tête.

Mais les exemples sur cette page ne semblent pas difficiles à saisir du tout.

+0

C'est simple plutôt que d'écrire un code long. –

5

Peut-être u peut essayer:

  • PEL(PHP Exif Library). Une bibliothèque pour lire et écrire des en-têtes Exif dans des images JPEG et TIFF en utilisant PHP.
  • The PHP JPEG Metadata Toolkit. Permet la lecture, l'écriture et l'affichage des formats de métadonnées JPEG suivants: EXIF ​​2.2, XMP/RDF, IPTC-NAA IIM 4.1 ect
  • ExifTool by perl. L'ExifTool est excellent. Il a tout compris: support EXIF, IPTC et XMP (lecture/écriture) et prise en charge des extensions fabricant.
+0

lien vers PEL est cassé, je pense. Essayez artfulrobot

12

Je sais que vous avez trouvé la solution, mais cela pourrait aider quelqu'un d'autre qui cherche la même chose! J'ai modifié une classe que j'ai trouvée here (merci debers).

Et toutes les références à IPTC peuvent être readed de cette PDF

Et maintenant, le code (PHP> = 5.4):

<? 
define("IPTC_OBJECT_NAME", "005"); 
define("IPTC_EDIT_STATUS", "007"); 
define("IPTC_PRIORITY", "010"); 
define("IPTC_CATEGORY", "015"); 
define("IPTC_SUPPLEMENTAL_CATEGORY", "020"); 
define("IPTC_FIXTURE_IDENTIFIER", "022"); 
define("IPTC_KEYWORDS", "025"); 
define("IPTC_RELEASE_DATE", "030"); 
define("IPTC_RELEASE_TIME", "035"); 
define("IPTC_SPECIAL_INSTRUCTIONS", "040"); 
define("IPTC_REFERENCE_SERVICE", "045"); 
define("IPTC_REFERENCE_DATE", "047"); 
define("IPTC_REFERENCE_NUMBER", "050"); 
define("IPTC_CREATED_DATE", "055"); 
define("IPTC_CREATED_TIME", "060"); 
define("IPTC_ORIGINATING_PROGRAM", "065"); 
define("IPTC_PROGRAM_VERSION", "070"); 
define("IPTC_OBJECT_CYCLE", "075"); 
define("IPTC_BYLINE", "080"); 
define("IPTC_BYLINE_TITLE", "085"); 
define("IPTC_CITY", "090"); 
define("IPTC_PROVINCE_STATE", "095"); 
define("IPTC_COUNTRY_CODE", "100"); 
define("IPTC_COUNTRY", "101"); 
define("IPTC_ORIGINAL_TRANSMISSION_REFERENCE", "103"); 
define("IPTC_HEADLINE", "105"); 
define("IPTC_CREDIT", "110"); 
define("IPTC_SOURCE", "115"); 
define("IPTC_COPYRIGHT_STRING", "116"); 
define("IPTC_CAPTION", "120"); 
define("IPTC_LOCAL_CAPTION", "121"); 

class IPTC 
{ 
    var $meta = []; 
    var $file = null; 

    function __construct($filename) 
    { 
     $info = null; 

     $size = getimagesize($filename, $info); 

     if(isset($info["APP13"])) $this->meta = iptcparse($info["APP13"]); 

     $this->file = $filename; 
    } 

    function getValue($tag) 
    { 
     return isset($this->meta["2#$tag"]) ? $this->meta["2#$tag"][0] : ""; 
    } 

    function setValue($tag, $data) 
    { 
     $this->meta["2#$tag"] = [$data]; 

     $this->write(); 
    } 

    private function write() 
    { 
     $mode = 0; 

     $content = iptcembed($this->binary(), $this->file, $mode); 

     $filename = $this->file; 

     if(file_exists($this->file)) unlink($this->file); 

     $fp = fopen($this->file, "w"); 
     fwrite($fp, $content); 
     fclose($fp); 
    }   

    private function binary() 
    { 
     $data = ""; 

     foreach(array_keys($this->meta) as $key) 
     { 
      $tag = str_replace("2#", "", $key); 
      $data .= $this->iptc_maketag(2, $tag, $this->meta[$key][0]); 
     }  

     return $data; 
    } 

    function iptc_maketag($rec, $data, $value) 
    { 
     $length = strlen($value); 
     $retval = chr(0x1C) . chr($rec) . chr($data); 

     if($length < 0x8000) 
     { 
      $retval .= chr($length >> 8) . chr($length & 0xFF); 
     } 
     else 
     { 
      $retval .= chr(0x80) . 
         chr(0x04) . 
         chr(($length >> 24) & 0xFF) . 
         chr(($length >> 16) & 0xFF) . 
         chr(($length >> 8) & 0xFF) . 
         chr($length & 0xFF); 
     } 

     return $retval . $value;    
    } 

    function dump() 
    { 
     echo "<pre>"; 
     print_r($this->meta); 
     echo "</pre>"; 
    } 

    #requires GD library installed 
    function removeAllTags() 
    { 
     $this->meta = []; 
     $img = imagecreatefromstring(implode(file($this->file))); 
     if(file_exists($this->file)) unlink($this->file); 
     imagejpeg($img, $this->file, 100); 
    } 
} 

$file = "photo.jpg"; 
$objIPTC = new IPTC($file); 

//set title 
$objIPTC->setValue(IPTC_HEADLINE, "A title for this picture"); 

//set description 
$objIPTC->setValue(IPTC_CAPTION, "Some words describing what can be seen in this picture."); 

echo $objIPTC->getValue(IPTC_HEADLINE); 
?> 
+0

'setValue' fonctionne très bien (testé avec un éditeur d'image) mais' getValue' retourne vide. une idée? – azerafati

0

Imagick ne vous permet de définir-données EXIF ​​mais seulement objets en mémoire, lors de l'écriture du fichier sur le disque, ces données sont simplement ignorées. La solution la plus populaire consiste soit à utiliser exiftools, soit à utiliser la bibliothèque PHP PEL. La documentation de PEL est clairsemée, et l'API n'est pas vraiment auto-explicative non plus. J'ai rencontré ce problème lorsque j'essayais d'ajouter les données EXIF ​​correctes aux images qui seraient téléchargées en tant qu'images 360 sur Facebook, ce qui nécessite que la marque et le modèle de la caméra soient spécifiés comme EXIF. Le code ci-dessous va ouvrir un fichier image, définir sa marque et son modèle, et sauvegarder sur le disque. Si vous cherchez à définir d'autres données EXIF, il existe une liste complète de toutes les constantes PelTag prises en charge here in the PEL docs.

$data = new PelDataWindow(file_get_contents('IMAGE PATH')); 
$tiff = null; 
$file = null; 

// If it is a JPEG-image, check if EXIF-headers exists 
if (PelJpeg::isValid($data)) { 
    $jpeg = $file = new PelJpeg(); 
    $jpeg->load($data); 
    $exif = $jpeg->getExif(); 

    // If no EXIF in image, create it 
    if($exif == null) { 
     $exif = new PelExif(); 
     $jpeg->setExif($exif); 

     $tiff = new PelTiff(); 
     $exif->setTiff($tiff); 
    } 
    else { 
     $tiff = $exif->getTiff(); 
    } 
} 
// If it is a TIFF EXIF-headers will always be set 
elseif (PelTiff::isValid($data)) { 
    $tiff = $file = new PelTiff(); 
    $tiff->load($data); 
} 
else { 
    throw new \Exception('Invalid image format'); 
} 

// Get the first Ifd, where most common EXIF-tags reside 
$ifd0 = $tiff->getIfd(); 

// If no Ifd info found, create it 
if($ifd0 == null) { 
    $ifd0 = new PelIfd(PelIfd::IFD0); 
    $tiff->setIfd($ifd0); 
} 

// See if the MAKE-tag already exists in Ifd 
$make = $ifd0->getEntry(PelTag::MAKE); 

// Create MAKE-tag if not found, otherwise just change the value 
if($make == null) { 
    $make = new PelEntryAscii(PelTag::MAKE, 'RICOH'); 
    $ifd0->addEntry($make); 
} 
else { 
    $make->setValue('RICOH'); 
} 

// See if the MODEL-tag already exists in Ifd 
$model = $ifd0->getEntry(PelTag::MODEL); 

// Create MODEL-tag if not found, otherwise just change the value 
if($model == null) { 
    $model = new PelEntryAscii(PelTag::MODEL, 'RICOH THETA S'); 
    $ifd0->addEntry($model); 
} 
else { 
    $model->setValue('RICOH THETA S'); 
} 

// Save to disk 
$file->saveFile('IMAGE.jpg'); 
Questions connexes