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í.