2013-08-31 136 views
1

我試圖壓縮PNG並將其保存爲JPG:rmagick壓縮和轉換PNG至JPG

i = Image.read("http://ds4jk3cl4iz0o.cloudfront.net/e2558b0d34221d3270189320173dabc2.png").first 

它的大小爲799 KB:

http://ds4jk3cl4iz0o.cloudfront.net/e2558b0d34221d3270189320173dabc2.png=>e2558b0d34221d3270189320173dabc2.png PNG 640x639 640x639+0+0 DirectClass 8-bit 799kb 

我將格式設置爲JPEG和質量爲10(即非常差的質量,所以文件大小應該大大減少):

i.format = 'JPEG' 

i.write("itest10.png") { self.quality = 10 } 

大小實際上增加到800kb!

=> http://ds4jk3cl4iz0o.cloudfront.net/e2558b0d34221d3270189320173dabc2.png=>itest40.png PNG 640x639 640x639+0+0 DirectClass 8-bit 800kb 

1)爲什麼?

2)如何壓縮照片使其尺寸爲< 150kb?

謝謝!

+0

由於文件擴展名,Rmagick可能會將格式更改回PNG。嘗試使用「.jpg」擴展名進行保存。 –

回答

9

使用'.png'擴展名會將格式改回到要寫入的調用中的PNG。

有兩種可能的解決方案。

首先,我建議你使用你的格式,如果可能的正常文件擴展名,因爲很多計算機系統將依賴於:

i = Image.read('demo.png').first 
i.format = 'JPEG' 
i.write('demo_compressed.jpg') { self.quality = 10 } 

如果這是不可能的,你可以設置格式內側各塊通過寫,擴展處理完畢,這將應用的格式:

i = Image.read('demo.png').first 
i.write('demo_compressed.png') do 
    self.format = 'JPEG' 
    self.quality = 10 
end 

在上述兩種情況下,我得到預期的高壓縮(低質量)JPEG格式的圖像。

2

我試了另一個答案,我仍然有問題的透明度。這裏此代碼爲我工作的罰款:

img_list = Magick::ImageList.new 

img_list.read('image.png') 

img_list.new_image(img_list.first.columns, img_list.first.rows) { 

    self.background_color = "white" 

} 

imageJPG = img_list.reverse.flatten_images 

imageJPG.write("out.jpg") 

的想法是先創建一個ImageList那麼PNG圖像加載到它,之後添加新的圖像到列表並設置其BG爲白色。然後,只需顛倒列表的順序,然後將圖像列表平鋪成單個圖像。要添加壓縮只需從上面的答案做self.quality事情。