我到处找过这个。我知道这可以使用.net中的一些库来完成,但我真的希望我的脚本生成一个"标记"的图像。原因是我们是一个论坛主持人,并与一家主题制作公司合作。主题制作公司希望我们能够追踪到任何非法分发的主题。我在GCHQ CanYouCrackIt练习中看到了iTXt的评论,认为这将是保护我们财产的最佳、无干扰的方法。
一个建议:如果你有一个固定的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);
}
?>