Совет: если у вас есть фиксированный блок iTXt , который вы хотите добавить к изображению, быстрой и грязной процедурой может быть просто вставить его непосредственно перед блоком IEND (12 байт) оригинальное изображение. Это должно работать, потому что iTXt может быть размещен до или после данных изображения. Конечно, это не проверяет, есть ли чанк как уже там.
Вот пример кода, использующий кусок tEXt
(немного проще), он нуждается в некоторой полировке, но в основном работает:
<?php
addTextToPngFile("x.png","x2.png","Watermark","Hi this is a TEXT test");
function addTextToPngFile($pngSrc,$pngTarget,$key,$text) {
$chunk = phpTextChunk($key,$text);
$png = file_get_contents($pngSrc);
$png2 = addPngChunk($chunk,$png);
file_put_contents($pngTarget,$png2);
}
// creates a tEXt chunk with given key and text (iso8859-1)
// ToDo: check that key length is less than 79 and that neither includes null bytes
function phpTextChunk($key,$text) {
$chunktype = "tEXt";
$chunkdata = $key . "\0" . $text;
$crc = pack("N", crc32($chunktype . $chunkdata));
$len = pack("N",strlen($chunkdata));
return $len . $chunktype . $chunkdata . $crc;
}
// inserts chunk before IEND chunk (last 12 bytes)
function addPngChunk($chunk,$png) {
$len = strlen($png);
return substr($png,0,$len-12) . $chunk . substr($png,$len-12,12);
}
?>