使用RMagick调整PNG图像大小而不失去质量

3

我需要在rmagick中将一个200*200的图片调整为60*60,而不会失去图片质量。目前我正在对png图片执行以下操作:

img = Magick::Image.from_blob(params[:file].read)[0]
  img.write(RootPath  + params[:dir_str] + "/#{filename}") do
    self.quality=100;
    #      self.compression = Magick::ZipCompression
  end

我在生成的图像中失去了锐度。我希望能够通过失去最少的图像质量来进行调整大小。 我尝试过设置图像质量和不同的压缩方式,但它们似乎都没有很好地起作用。 所有生成的图像看起来仍然失去了一层颜色,并且字形失去了锐度。 有人可以给我一些缩放PNG图像的指导吗?

1
PNG是一种无损格式,因此任何质量损失都是由imagemagik的算法或者你将分辨率缩小三分之一所导致的,这会改变图像的质量。 - Andrew Marshall
真的吗?你将一张200x200 = 40,000 的图片调整到60x60 = 3,600,即分辨率不到十分之一,然后你惊讶地发现失去了图像质量? - Chris Latta
@ChrisLatta 您是正确的;我在分辨率数学方面失败了,将尺寸除以了像素数。十分之一远远大于三分之一。 - Andrew Marshall
设计艺术家告诉我,结果图像失去了质量。他给了我一个期望的60*60图片,是使用PS调整大小的。我检查了这张图片并将其与生成的图片进行了比较,发现它们看起来非常不同。因此,我尝试了rmagick提供的所有压缩类型,但所有的结果图像都失去了清晰度。 - Lion
如果这是由ImageMagick的算法引起的,是否有任何宝石工具可以提供更好的图像调整大小解决方案? - Lion
我尝试了不同的方法来调整大小,似乎'Magick::SincFilter'这个方法可以提供更好的视图。但是,它仍然没有达到预期的图像效果。还有其他的方法可以尝试吗? - Lion
2个回答

0
你正在将一张200x200像素的图片缩小到60x60像素,即分辨率不到原来的十分之一,然后你惊讶地发现失去了图像质量?可以这样想——你能否将一个16x16像素的图像调整大小为5x5而不失去质量?这与你在此尝试做的事情大致相同。
如果你所说的是可能的,那么每张图片都可以被缩小到一个像素而不会失去质量。
至于艺术设计师的60x60像素图像是否比你的更好,这取决于艺术设计师所使用的原始图像的大小。例如,如果艺术设计师从一个800x800像素的图像中工作,并从中提供了你的200x200像素图像,然后在PS中将原始800x800像素的图像缩小到60x60像素,那么这个60x60像素的图像将比你的更好。这是因为你的60x60像素图像经历了两次质量损失:一次是从200x200像素到60x60像素,另一次是从原始大小到200x200像素。必然会比从原始大小调整大小的图像更差。

不,不是的,美工给了我两张图片,一张是原始的200200像素,另一张是期望的6060像素。我的任务是让服务器从客户端获取上传的图片,保存它并向用户提供一个6060的预览。我将上传的图片与原始的200200进行了比较(嗯,使用了相同的img.write方法将其存储在服务器上),它们看起来非常相似,肉眼几乎找不到什么区别,但是当检查生成的6060图像时,它确实不好,200200图像上的文字几乎无法识别(期望的60*60不会出现这种情况)。 - Lion
所以我想找到一个更好的方法让图像有更好的视觉效果。 - Lion
请记住,质量的降低是呈指数而非线性下降的。例如,分辨率为200x200一半质量/分辨率的图片不是100x100,而是141x141。100x100是200x200分辨率的四分之一,因此分辨率的指数减少意味着当您到达60x60时,它的分辨率不足十分之一,从而影响质量。我认为您从艺术设计师那里得到了一个60x60的图像,该图像与您使用的过程不同 - 即您的60x60已经经历了两次缩放和质量损失,而另一个则仅有一次。 - Chris Latta
好的,我认为你是对的。希望我能说服我的老板,无论如何我已经为他准备了一个最清晰的预览。而我使用的方法是: img = imgl.resize(width, height, Magick :: SincFilter) img.write(new_image_name) do self.compression = Magick :: ZipSCompression self.quality = 100; end - Lion

0
你可以将png转换为矢量图像,调整矢量图像大小为60x60,然后再将其转换为png。几乎无损。

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