如何在不损失图片质量的情况下移除JPG图片的Exif信息?

23

我有一个 PHP 照片分享应用程序,用户上传的图像会使用 ImageMagick 转换为各种缩略图格式。

作为一种看似“聪明”的节省文件大小的方式,我正在去除这些缩略图中的 exif 信息,如下所示:

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

这个方法可以去除EXIF信息,其中一个30KB的缩略图可节省12KB,变成18KB。当在单个页面上展示多个这样的缩略图时,可以显著地减少页面加载时间。

然而问题是它效果太好了。生成的图像似乎失去了很多颜色信息,与其未被处理的版本相比看起来“平淡”。

根据我的研究,我认为以下一项或两项都是正确的:

  • Imagick在去除信息过程中丢弃了必要的颜色配置文件信息
  • Imagick在保存图像时重新压缩了图像,导致质量损失

无论问题的原因是什么,我正在寻找一种以不影响图像质量或颜色本身的方式去除EXIF信息。

这是否可能呢?

更新:

基于Gerald Schneider的答案,我尝试在“去除”图像之前将质量设置强制设置为100%:

$imagick = new Imagick($image);
$imagick->setCompression(imagick::COMPRESSION_JPEG);
$imagick->setCompressionQuality(100);
$imagick->stripImage();
$imagick->writeImage($image);
很遗憾,问题仍然存在。以下是示例输出,即使将质量设置为100%,图像仍然被压扁。

在这里输入图像描述


2
我有点怀疑删除EXIF并不能减小文件大小那么多。我猜测文件大小的减小更多是由于重新压缩,可能比之前的质量更低。你尝试使用getCompressionQuality()setCompressionQuality()了吗? - Gerald Schneider
@jeroen 謝謝,但這會導致相同的效果。 - Fer
当Imagemagick打开一个jpg文件并不做任何处理,然后保存它时,图像将被压缩。为什么不在创建缩略图时就删除数据呢? - Bonzo
请查看有关jpg和Imagemagick的此页面:http://www.imagemagick.org/Usage/formats/#jpg - Bonzo
1
如果几KB真的很重要,可以降低缩略图的压缩比。或者尝试打开原始图像,调整大小,然后将其复制到新图像中并保存。只要图像库正确地翻译色彩配置文件,这可能会删除不必要的EXIF数据。您可能需要显式复制色彩配置文件,或使用更好的库。如果您真的很在意,可以深入研究JPEG规范,并根据试错基础手动删除EXIF数据,直到保留重要部分。http://www.media.mit.edu/pia/Research/deepview/exif.html - Levi
显示剩余9条评论
3个回答

32

考虑在删除所有其他EXIF数据的同时保留ICC配置文件(导致更丰富的颜色):

  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 beta 版本时,我从 getImageProfiles() 得到的结果与文档略有不同。建议您尝试调整参数,直到得到一个带有实际配置文件的关联数组。)

对于命令行 ImageMagick:

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

当然,如果您使用ImageMagick,图像将被重新压缩,但至少颜色会保持不变。

希望这能帮到您。


1
谢谢,Robbert。我尝试了很多其他技术,但这是唯一一个给我想要的结果的技术。我正在使用命令行中的ImageMagick,所以我必须进行一些翻译:1)将配置文件保存到文件convert image.jpg profile.icm 2)从图像中删除配置文件,然后从文件重新应用 convert image.jpg -auto-orient -strip -profile profile.icm output.jpg - Chad von Nau
很高兴能帮上你,Chad。感谢提供命令行替代方案 - 我已将你的代码添加到答案中。 - Robbert
很酷,只是提醒一下,-auto-orient用于调整带有exif旋转数据的照片方向,并不是命令运行所必需的。我本来想把它从注释中删除,但我的编辑窗口已经过期了! - Chad von Nau
我在想那是做什么用的,忘了谷歌一下。谢谢! - Robbert
我想从Java(jmagick)中删除元数据。有什么帮助吗? - Querier
以上的 ImageMagick 命令无法处理此图像:http://capitalinvestments.ru/wp-content/uploads/2016/04/warren-buffett-reuters-110213.jpg. 元数据被移除后,图片颜色严重丢失。 - Querier

1

由于文件头中 MIME 类型存储不正确,我们已经对其进行了类似的更改。我建议您通过标准工具验证 EXIF 数据的长度,然后使用多字节字符串函数手动“清零”数据。

JPEG 文件中的 EXIF 最大只能为 64KB,但我不确定是否确切为 64KB,因此建议您从这里开始。


-2

GIMP(另一个开源图像编辑器)也允许在不损失图像/图片质量的情况下删除EXIF、IPTC、XMP、缩略图、ICC(颜色配置文件)等元数据。

在GIMP中打开图像后,选择“导出”/“另存为”等选项,然后选择/取消选择要删除/保留的元数据。

为了保持原始图像质量,您必须选择(打勾)位于顶部“质量”滑动条下方的“使用原始图像的质量设置”选项。

我通常喜欢选择ICC(保存颜色配置文件元数据)选项,以保持彩色照片的良好颜色质量。
其他选项(保存EXIF、保存IPTC、保存XMP、保存缩略图等)我通常会取消选择。

更多信息:此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接