如何从JPG不会丢失图像质量删除EXIF?(How to remove exif from a JP

2019-07-04 07:33发布

我有哪个用户上传的图像调整到使用ImageMagick各种拇指格式PHP照片分享应用。

作为一个看似“聪明”的方式来保存文件的大小,我剥从这些大拇指如下EXIF信息:

$imagick = new Imagick($image);
$imagick->stripImage();
$imagick->writeImage($image);

这工作。 它不会删除EXIF信息,其中30KB的大拇指节省了12KB和18KB变。 呈现出显著节省当许多这样的拇指在一个页面上。

但问题是,它的工作原理有点太清楚了。 所产生的图像似乎失去了很多的颜色信息,并与他们未剥离的版本看“蜗居”。

根据我的研究,到目前为止,我的理论是,以下的一个或两个是正确的:

  • Imagick扔掉必要的颜色配置文件信息作为剥离过程的一部分
  • Imagick在保存它重新压缩图像,失去质量

无论问题的原因,我正在寻找一种方式来消除这样一种方式,它不影响图像质量或颜色本身EXIF信息。

这甚至可能吗?

更新:

基于杰拉德施奈德的回答,我想执行的质量设置为100%之前,“剥离”的形象:

$imagick = new Imagick($image);
$imagick->setCompression(imagick::COMPRESSION_JPEG);
$imagick->setCompressionQuality(100);
$imagick->stripImage();
$imagick->writeImage($image);

不幸的是,问题依旧。 下面是示例输出,其中尽管将质量设置为100%时,图像仍平坦化。

Answer 1:

考虑保持ICC配置文件(这将导致更丰富的色彩),而卸下所有其它EXIF数据:

  1. 提取ICC配置文件
  2. 地带EXIF数据和图像轮廓
  3. 添加ICC配置文件回

在PHP + imagick:

$profiles = $img->getImageProfiles("icc", true);

$img->stripImage();

if(!empty($profiles))
    $img->profileImage("icc", $profiles['icc']);

(重要提示:使用ImageMagick的3.1.0测试版,从我得到的结果getImageProfiles()是从稍微不同的文件 。我建议与参数玩耍,直到你得到的实际轮廓(S)的关联数组。 )

命令行的ImageMagick:

convert image.jpg profile.icm
convert image.jpg -strip -profile profile.icm output.jpg

图片将得到重新压缩,当然,如果你使用的ImageMagick,但至少颜色保持不变。

希望这可以帮助。



Answer 2:

在作出对MIME类型的文件头中存储的错误类似的变化,我建议您通过标准工具验证EXIF数据的长度,然后“零”使用手动多字节字符串函数的数据。

EXIF只能在一个JPEG文件的最大64KB的,但我还不能肯定,如果它是exacly 64KB,所以我会用这个开始。



文章来源: How to remove exif from a JPG without losing image quality?