2012-11-30 41 views
17

我具有其中用户上载的图像的大小被调整成使用ImageMagick各种拇指格式PHP照片共享应用程序。如何从JPG中删除exif而不会丢失图像质量?

这样看似“聪明”的方式来保存文件的大小,我剥从这些大拇指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%,图像仍然是平坦的。

enter image description here

+2

不知何故,我怀疑删除EXIF会减小文件的大小。我猜文件大小的减少是由于重新压缩造成的,可能比以前质量更低。你尝试过使用'getCompressionQuality()'和'setCompressionQuality()'吗? –

+0

@GeraldSchneider这取决于。我已经看到EXIF数据的字面数百KB(在某些极端情况下差不多有半兆)的文件。剥离EXIF的图像总是一个好主意。 – mingos

+0

这对于直接从相机拍摄的图像可能是正确的,但对于生成的缩略图? –

回答

22

考虑保持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()得到的结果与documentation稍有不同。我建议玩弄的参数,直到你得到的实际轮廓(S)的关联数组)

对于命令行ImageMagick的:

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

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

希望这会有所帮助。

+1

谢谢,罗伯特。我尝试了其他一些技巧,但是这是唯一一个给我结果的人。我正在从命令行使用ImageMagick,所以我不得不翻译一下:1)将配置文件保存到文件'convert image.jpg profile.icm' 2)从图像中剥离配置文件,然后从文件'convert image.jpg -auto-orient -strip -profile profile.icm output.jpg' –

+0

很高兴为您提供帮助,乍得。感谢您提供命令行选项 - 我已将您的代码添加到答案中。 – Robbert

+0

酷,只是fyi,-auto-orient用于使用exif旋转数据定向照片,而不是命令工作所必需的。我的意思是把它从评论中删除,但我的编辑窗口已过期! –

1

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

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

相关问题