Ruby rmagick压缩并将png转换为jpg

Ruby rmagick压缩并将png转换为jpg,ruby,imagemagick,rmagick,Ruby,Imagemagick,Rmagick,我正在尝试压缩png并将其另存为jpg: i = Image.read("http://ds4jk3cl4iz0o.cloudfront.net/e2558b0d34221d3270189320173dabc2.png").first 其大小为799KB: http://ds4jk3cl4iz0o.cloudfront.net/e2558b0d34221d3270189320173dabc2.png=>e2558b0d34221d3270189320173dabc2.png PNG 64

我正在尝试压缩png并将其另存为jpg:

i = Image.read("http://ds4jk3cl4iz0o.cloudfront.net/e2558b0d34221d3270189320173dabc2.png").first
其大小为799KB:

http://ds4jk3cl4iz0o.cloudfront.net/e2558b0d34221d3270189320173dabc2.png=>e2558b0d34221d3270189320173dabc2.png PNG 640x639 640x639+0+0 DirectClass 8-bit 799kb 
我将格式设置为jpeg,质量设置为10(即质量非常差,因此文件大小应该大大减小):

大小实际上增加到800kb

 => http://ds4jk3cl4iz0o.cloudfront.net/e2558b0d34221d3270189320173dabc2.png=>itest40.png PNG 640x639 640x639+0+0 DirectClass 8-bit 800kb 
1) 为什么?

2) 如何压缩照片,使其大小小于150kb


谢谢

调用write时,使用“.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格式图像。

我尝试了另一种答案,但透明度仍然存在问题。这里的代码对我来说很好:

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操作。

Rmagick可能会因为文件扩展名而将格式更改回PNG。尝试使用“.jpg”扩展名保存。
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" )