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 ?

谢谢!

4

2 回答 2

10

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

于 2013-09-01T20:48:51.843 回答
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 图像加载到其中,然后将新图像添加到该列表并将其 bg 设置为白色。然后只需颠倒列表的顺序,然后将图像列表展平为单个图像。要添加压缩,只需执行上述答案中的 self.quality 即可。

于 2014-12-04T00:00:23.667 回答