2011-08-31 114 views
152

我想使用ImageMagick壓縮JPG圖像文件,但不能在尺寸上獲得太大的區別。默認情況下,輸出大小比輸入大。我不知道爲什麼,但在添加了一些+配置文件選項並降低質量後,我可以獲得更小的尺寸,但仍與原始類似。使用ImageMagick壓縮JPG文件的建議

輸入圖像爲255kb,處理後的圖像爲264kb(使用+配置文件刪除配置文件並將質量設置爲70%)。至少有什麼辦法將該圖像壓縮到150kb?那可能嗎?我可以使用哪些ImageMagick選項?

+2

重新壓縮爲JPEG總是會導致降級的圖像,即使是較大的。如果你可以在第一次保存之前從原稿開始,那會更好。 –

+0

我知道,但不幸的是我沒有原始圖像,我只有一個很大的JPG文件,但我認爲我可以在質量和尺寸之間取得很好的平衡 –

回答

309

我使用總是:

  • 質量在85
  • 逐行(comprobed壓縮)
  • 一個非常小的gausssian模糊優化尺寸(0.05或半徑的0.5)取決於質量和大小的圖片,這顯着優化了jpeg的大小。
  • 地帶
在ImageMagick的

應該

convert -strip -interlace Plane -gaussian-blur 0.05 -quality 85% source.jpg result.jpg 

希望這是有用的任何意見或EXIF標籤。

來源鏈接:http://www.yuiblog.com/blog/2008/12/05/imageopt-4/

從@Fordi的意見(不要忘了讚許他的評論,如果你喜歡): 如果你不喜歡模糊,使用-sampling-factor 4:2:0代替。這樣做會將色度通道的分辨率降低一半,而不會影響您眼睛鎖定的亮度分辨率。如果您希望在轉換中保持更高的保真度,則可以通過指定-define jpeg:dct-method=float - 即使用更精確的浮點離散餘弦轉換而不是缺省快速整數版本,在不增加文件大小的情況下獲得輕微改善。

+2

謝謝!這段代碼讓我的圖像達到了170kb,現在我可以去試驗你的代碼了,謝謝你,我也發現了-define:extent = MAX_SIZE_IN_KB選項,真的有用,謝謝! –

+22

如果你正在做一堆文件,你也可以做'mogrify -strip -interlace Plane -gaussian-blur 0.05 -quality 85%* .jpg'。確保在運行該命令之前進行備份。它會寫入到位。 –

+3

'-strip'爲我做了。謝謝 –

9

一旦我需要調整從相機拍攝的照片進行開發:

  • 原始文件大小:2800 KB
  • 分辨率:3264X2448

命令:

mogrify -quality "97%" -resize 2048x2048 -filter Lanczos -interlace Plane -gaussian-blur 0.05 
  • 結果filesize 753 kB
  • 分辨率爲2048x2048

,我不能看到全屏幕與我的1920×1080分辨率的顯示器的任何變化。 2048分辨率對於以360 dpi的最高質量開發10釐米照片是最佳選擇。我不想剝奪它。

編輯:我注意到,我甚至沒有模糊得到更好的結果。不模糊文件大小是原來的50%,但質量更好(縮放時)。

+0

您不必添加「-filter Lanczos」。如上所述,它默認設置爲http://www.imagemagick.org/script/command-line-options.php#filter –

+0

- 降低圖像分辨率以使文件變小是沒有用的。反而降低JPEG質量!你可以自己測試 - 比較兩個圖像,一個97%JPEG,另一個轉換爲68%,即使你看到100%的變焦,你也很難看到任何像素不同。股票相機和手機的設置是可笑的高,只是爲了讓你想買更大的存儲空間和更大的硬盤爲你的電腦的新手機... https://photo.stackexchange.com/questions/30243/what-quality-to-choose - 當轉換到JPG – McVitas

14

只是說在PHP中使用Imagick類誰的:

$im -> gaussianBlurImage(0.8, 10);  //blur 
$im -> setImageCompressionQuality(85); //set compress quality to 85 
8

我想補充一個有益的補充說明和一般建議儘量減少JPG和PNG。

首先,ImageMagick的讀取(或更好「猜測」 ...)輸入JPEG壓縮級別,因此,如果你不加-quality NN可言,輸出應使用同一水平輸入。有時可能是一個重要的功能。否則默認級別爲-quality 92(請參閱www.imagemagick.org

該建議是關於一個非常棒的免費工具ImageOptim,也適用於批處理。
你可以得到更小的jpgs(以及pngs,尤其是在使用免費的ImageAlpha [非批處理]或免費的Pngyu,如果你需要批處理的話)。
這些工具不僅適用於Mac和Win,還適用於命令行(我建議使用Brew進行安裝,然後在Brew公式中進行搜索)。

9

我使用Google Pagespeed Insights圖像優化準則以及ImageMagick的他們提出以下建議:

-sampling因子4:2:0
-strip
-quality 85它可以變化,我使用範圍60-80]
-interlace
-colorspace RGB

命令中的ImageMagick:

convert image.jpg -sampling-factor 4:2:0 -strip -quality 85 -interlace JPEG -colorspace RGB image_converted.jpg 

使用這些選項,我可以節省高達40%的JPEG大小,而不會有明顯的損失。

1

在這裏做了一些實驗,男孩確實做出了與高斯模糊不同的感覺。我用最後的命令是:

mogrify * -sampling因子4:2:0 -strip -quality 88 -interlace平面-define JPEG:DCT-方法=浮子-colorspace RGB -gaussian模糊0.05

如果沒有0.05的高斯模糊,它大約是261kb,對於我正在測試的圖像大約是171KB。直到你放大方式方式與大型複雜圖像的1440P顯示器上的視覺差異並不明顯。

2

我加-adaptive-resize 60%所建議的命令,但-quality 60%

convert -strip -interlace Plane -gaussian-blur 0.05 -quality 60% -adaptive-resize 60% img_original.jpg img_resize.jpg 

這些都是我的結果

  • img_original.jpg = 13,913KB
  • img_resized.jpg = 845KB

我不知道如果轉換破壞我的形象太,但我真的不認爲我的轉換看起來像垃圾。這是一個廣角全景,我不在乎細緻的障礙。

1

@JavisPerez - 有沒有任何方法可以將圖像至少壓縮到150kb? 可能嗎?我可以使用哪些ImageMagick選項?

請參閱以下鏈接,其中ImageMagick中有一個選項用於指定寫入JPG文件所需的輸出文件大小。

http://www.imagemagick.org/Usage/formats/#jpg_write http://www.imagemagick.org/script/command-line-options.php#define

-define jpeg:extent={size} As of IM v6.5.8-2 you can specify a maximum output filesize for the JPEG image. The size is specified with a suffix. For example "400kb".

convert image.jpg -define jpeg:extent=150kb result.jpg 

你將失去​​通過解壓縮和重新壓縮除任何損失,由於從輸入降低-quality值一些質量。

0

下面是在PHP中使用Imagick這些完整的解決方案:

$im = new \Imagick($filePath); 
$im->setImageCompression(\Imagick::COMPRESSION_JPEG); 
$im->setImageCompressionQuality(85); 
$im->stripImage(); 
$im->setInterlaceScheme(\Imagick::INTERLACE_PLANE); 

// Try between 0 or 5 radius. If you find radius of 5 
// produces too blurry pictures decrease to 0 until you 
// find a good balance between size and quality. 
$im->gaussianBlurImage(0.05, 5); 



// Include this part if you also want to specify a maximum size for the images 

$size = $im->getImageGeometry(); 
$maxWidth = 1920; 
$maxHeight = 1080; 


// ---------- 
// |  | 
// ---------- 
if($size['width'] >= $size['height']){ 
    if($size['width'] > $maxWidth){ 
    $im->resizeImage($maxWidth, 0, \Imagick::FILTER_LANCZOS, 1); 
    } 
} 


// ------ 
// | | 
// | | 
// | | 
// | | 
// ------ 
else{ 
    if($size['height'] > $maxHeight){ 
    $im->resizeImage(0, $maxHeight, \Imagick::FILTER_LANCZOS, 1); 
    } 
}