rmagick压缩并将png转换为jpg

0xS*_*ina 2 ruby rmagick imagemagick

我想压缩一个png并将其保存为jpg:

i = Image.read("http://ds4jk3cl4iz0o.cloudfront.net/e2558b0d34221d3270189320173dabc2.png").first
Run Code Online (Sandbox Code Playgroud)

它的大小是799 kb:

http://ds4jk3cl4iz0o.cloudfront.net/e2558b0d34221d3270189320173dabc2.png=>e2558b0d34221d3270189320173dabc2.png PNG 640x639 640x639+0+0 DirectClass 8-bit 799kb 
Run Code Online (Sandbox Code Playgroud)

我将格式设置为jpeg,质量设置为10(即质量非常差,因此文件大小应该大大减少):

i.format = 'JPEG'

i.write("itest10.png") { self.quality = 10 }
Run Code Online (Sandbox Code Playgroud)

大小实际上增加到800kb!

 => http://ds4jk3cl4iz0o.cloudfront.net/e2558b0d34221d3270189320173dabc2.png=>itest40.png PNG 640x639 640x639+0+0 DirectClass 8-bit 800kb 
Run Code Online (Sandbox Code Playgroud)

1)为什么?

2)如何压缩照片,使尺寸<150kb?

谢谢!

Nei*_*ter 9

使用'.png'扩展名会在写入调用时将格式更改回PNG.

有两种可能的解决方案.

首先,我建议尽可能使用普通文件扩展名作为格式,因为很多计算机系统都会依赖它:

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

如果这不可能,您可以设置传递给write的块内的格式,这将在处理扩展后应用格式:

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

在上述两种情况下,我都得到了预期的高压缩(和低质量)jpeg格式图像.