2012-11-30 43 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,所以我會用這個開始。

相關問題