需求描述:使用PHP对图片文件进行优化处理,但此优化处理只能进行一次,二次进行会对图片造成不可恢复的损坏。期望在图片一次处理之后,在图片文件中写入一个自定义的字符串,什么都行,仅用于判断图片是否经过处理。
期待可以使用PHP解决。目前想到JPEG格式的话有 EXIF信息,可以尝试从这个作为突破,在EXIF信息中写入一个自定义的字符串。但GIF,PNG,BMP呢,怎么能解决常用的网络图片格式?google到这货
Imagick::setImageProperty根据文档http://www.php.net/manual/zh/imagick.setimageproperty.php貌似刚好符合要求,但是使用这个函数保存图片,再次读取却为空,不晓得是不是我的用法有问题
$image = new Imagick($file);
$image->setImageProperty('Exif:Make', 'Imagick');
$image->writeImage($file2);$image2 = new Imagick($file2);
echo $image->getImageProperty('Exif:Make');这个是一个思路,但没能实现,真希望是我用法有问题,而不是这个函数不可实现。又尝试使用 APP13
$size = getimagesize('1.jpg', $info);var_dump($size);
if(isset($info['APP13']))
{
$iptc = iptcparse($info['APP13']);
var_dump($iptc);
}
但也不行。难道我一直在走弯路?有什么好的办法吗?要的不多,就是想在不破快图片的基础上在图片数据中写入一个字符串,供下次读取这个字符串。大大们现身吧,给点指点,解决问题立刻散分。
PHP图片
期待可以使用PHP解决。目前想到JPEG格式的话有 EXIF信息,可以尝试从这个作为突破,在EXIF信息中写入一个自定义的字符串。但GIF,PNG,BMP呢,怎么能解决常用的网络图片格式?google到这货
Imagick::setImageProperty根据文档http://www.php.net/manual/zh/imagick.setimageproperty.php貌似刚好符合要求,但是使用这个函数保存图片,再次读取却为空,不晓得是不是我的用法有问题
$image = new Imagick($file);
$image->setImageProperty('Exif:Make', 'Imagick');
$image->writeImage($file2);$image2 = new Imagick($file2);
echo $image->getImageProperty('Exif:Make');这个是一个思路,但没能实现,真希望是我用法有问题,而不是这个函数不可实现。又尝试使用 APP13
$size = getimagesize('1.jpg', $info);var_dump($size);
if(isset($info['APP13']))
{
$iptc = iptcparse($info['APP13']);
var_dump($iptc);
}
但也不行。难道我一直在走弯路?有什么好的办法吗?要的不多,就是想在不破快图片的基础上在图片数据中写入一个字符串,供下次读取这个字符串。大大们现身吧,给点指点,解决问题立刻散分。
PHP图片
示例代码
$url = 'http://avatar.profile.csdn.net/0/E/F/1_jaylecn.jpg';
$im = imagecreatefromjpeg($url);
imagepng($im, 'test.png'); //产生一个 png 图片文件
$s = 'abcefg'; //待附加的信息
file_put_contents('test.png', sprintf('%sInfo%s', $s, pack('n', strlen($s))), FILE_APPEND); //按自定义格式附加在图片文件之后//回读
$s = file_get_contents('test.png');
$t = unpack('A4t/noffs', substr($s, -6)); //取回自定义信息的长度
$v = substr($s, -6 - $t['offs'], -6); //取回自定义信息
echo $v;//abcdef
请自行验证图片数据没有被破坏
因为此类图片都是压缩保存的,在文件头部都有一个数据区长度的表识。
图片显示时,软件通过该标识读取并解压数据但对于 GD 不支持的,比如 bmp 文件,就没有那么幸运了。
bmp 的数据是从文件尾向文件头方向排列的,如果你在文件尾部添加内容,就将破坏图片数据