22

我有一个 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%,但图像仍然是扁平的。

在此处输入图像描述

4

3 回答 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 测试版,我得到的结果与文档getImageProfiles()略有不同。我建议您使用参数,直到您获得一个具有实际配置文件的关联数组。)

对于命令行 ImageMagick:

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

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

希望这可以帮助。

于 2013-07-07T22:07:41.770 回答
1

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

EXIF 在 JPEG 文件中最多只能是 64KB,但是我不肯定它是否正好是 64KB,所以我会从这个开始。

于 2012-12-13T22:12:09.090 回答
0

GIMP(另一个开源图像编辑器)还允许删除 EXIF、IPTC、XMP、缩略图、ICC(颜色配置文件)等元数据,而不会丢失图像/图片质量。

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

要保持原始图像质量,您必须选择(勾选)选项“使用原始图像的质量设置”,该选项显示在顶部的“质量”滑动条下方。

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

更多信息:这里

于 2021-02-02T04:00:04.773 回答