2013-08-31 41 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事情。