Rmagick压缩和将PNG转换为JPG

3

我试图压缩一张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?

谢谢!


Rmagick 可能因为文件扩展名而将格式改回 PNG。尝试使用“.jpg”扩展名保存。 - Neil Slater
2个回答

10

使用'.png'扩展名将在调用write时将格式更改回PNG。

有两种可能的解决方案。

首先,如果可能的话,建议使用您的格式的正常文件扩展名,因为许多计算机系统将依赖于此:

i = Image.read( 'demo.png' ).first
i.format = 'JPEG'
i.write( 'demo_compressed.jpg' ) { |image| image.quality = 10 }
如果不可能的话,您可以在传递给write的块内设置格式,这将在扩展处理后应用格式:
i = Image.read( 'demo.png' ).first
i.write( 'demo_compressed.png' ) do |image|
  image.format = 'JPEG'
  image.quality = 10
end

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


由于最近RMagick的更改,此处已更新(感谢发布评论)。原始代码片段如下:

i.write( 'demo_compressed.jpg' ) { self.quality = 10 }

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

这些在旧版本的RMagick安装中仍然可以使用。


1
随着Rmagic的新更新,“i.write('demo_compressed.jpg'){self.quality = 10}”将不再起作用。请改用“i.write('demo_compressed.jpg'){|image| image.quality = 10}”。 - titan
1
@titan 谢谢,我根据你的评论更新了代码示例。 - Neil Slater

4

我尝试了其他答案,但是我仍然在透明度方面遇到问题。这段代码对我来说很好用:

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图像加载到其中,之后向该列表添加新图像并将其背景设置为白色。然后只需反转列表顺序,再将图像列表合并为单个图像。要添加压缩,请按照上面的答案执行self.quality操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接