我正在尝试压缩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)我如何压缩照片以使尺寸<1。 150kb?
谢谢!
答案 0 :(得分:9)
使用'.png'扩展程序会在写入调用时将格式更改回PNG。
有两种可能的解决方案。
首先,我建议尽可能使用普通文件扩展名,因为很多计算机系统都会依赖它:
i = Image.read( 'demo.png' ).first
i.format = 'JPEG'
i.write( 'demo_compressed.jpg' ) { self.quality = 10 }
如果无法做到这一点,您可以设置传递给write的块内的格式,这将在处理扩展后应用格式:
i = Image.read( 'demo.png' ).first
i.write( 'demo_compressed.png' ) do
self.format = 'JPEG'
self.quality = 10
end
在上述两种情况下,我都得到了预期的高压缩(和低质量)jpeg格式图像。
答案 1 :(得分:3)
我尝试了另一个答案,我仍然遇到透明问题。这段代码对我来说很好用:
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事。