Escribir con UTF-8 en etiquetas IPTC

Tenía que escribir en imágenes la información IPTC y resulta que no se veían los acentos y otros caracteres porque sepa cual es la codificación natural para las etiquetas, pero se puede solucionar añadiéndolas con charset UTF-8. Aquí dejo un código de ejemplo:

<?php 
   /* 
   * @toro escribir etiquetas IPTC en imagen, charset UTF-8 
   */ 
   $imagen = "test.jpg";
   $nueva = "nueva.jpg"; 
   $iptc = [
      '2#005' => 'Limón',                                               //DocumentTitle
      '2#120' => 'Un ñandú se bañaba en las orillas del río Éufrates.', //Caption
      '2#116' => '@toro',                                               //Copyright
   ];
   //
   $data = chr(0x1b).chr(0x25).chr(0x47); 
   $data = chr(0x1C).chr(1).chr('090').chr(strlen($data)>>8).chr(strlen($data)&0xFF).$data;
   foreach($iptc AS $k=>$v) { $e = substr($k,2); $data .= iptc_make_tag(2, $e, $v); }
   copy($imagen,$nueva);                        //copiamos la imagen a la nueva
   $contenido = iptcembed($data, $nueva);
   $fp = fopen($nueva, "wb");
   fwrite($fp, $contenido);
   fclose($fp);
   unset($contenido,$data);
   //función ejemplo http://php.net/manual/es/function.iptcembed.php
   function iptc_make_tag($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;
   }

Eso es todo, aquí la imagen original y aquí la modificada. El código fuente de ese ejemplo también está aquí.

+ fotos / videos

Almacenado en PHP, línea de comandos, IPTC

por Jorge Martínez Mauricio :)

blog / fotos / archivo

Escribir con UTF-8 en etiquetas IPTC

tar.mx es un blog sobre fotografía, tecnología y otras chunches

modificado jueves 8 de julio de 2021, 19:08