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