Imagemagick 使用rmagick调整png图像的大小而不丢失质量

Imagemagick 使用rmagick调整png图像的大小而不丢失质量,imagemagick,image-resizing,rmagick,Imagemagick,Image Resizing,Rmagick,我需要在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 en

我需要在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图像大小的说明吗?

您正在将图片的大小从200x200=40000调整到60x60=3600,也就是说,不到分辨率的十分之一,并且您对失去图像质量感到惊讶?这样想吧,你能不能拍一张16x16的图像,在不损失质量的情况下将其调整到5x5?这和你在这里要做的差不多

如果你所说的你想做的事情实际上是可能的,那么每一张图片都可以减少到一个像素而不会降低质量


由于艺术设计师的60x60图像比您的图像质量更好,这取决于艺术设计师使用的图像的原始大小。例如,如果艺术设计师使用的是800x800图像,并提供了您的200x200图像,然后还将原始800x800图像减少到60x60(PS),那么60x60图像的质量将比您拥有的图像更好。这是因为您的60x60图像经历了两次质量损失:一次到200x200,另一次从200x200到60x60。这必然比从原始图像调整大小的图像更糟糕

您可以将png转换为矢量图像,将矢量大小调整为60x60,然后将矢量转换为png。几乎是无损的。

PNG是一种无损格式,因此任何质量损失要么是由于imagemagik的算法造成的,要么就是因为您将分辨率降低到了第三位,从而改变了一切。真的吗?你正在将一张图片的大小从200x200=40000调整到60x60=3600——也就是说,不到分辨率的十分之一——你会惊讶于图像质量的下降吗?@ChrisLatta你说得对;我在分辨率数学方面失败了,我将维度划分,而不是像素计数。十分之一远远超过三分之一。嗯,艺术设计告诉我,结果图像质量正在下降。他给了我一张预期的60*60的图片,它是用PS调整大小的。我检查了图片,并与生成的图片进行了比较,它确实看起来很不一样。所以我尝试了rmagick提供的所有压缩类型,但是所有的结果图像都失去了清晰度如果这是由imagemagik的算法造成的,有没有任何gem工具可以提供更好的图像大小调整解决方案?没有,没有,艺术设计师给了我两张图像,一张是原始的200*200,另一张是预期的60*60。我的工作是让服务器从客户端获取上传图像,保存它,并为用户提供60*60的预览。我将上传的图像与原始的200*200图像进行了比较,(嗯,使用相同的img.write方法将其存储在服务器中),两者看起来非常相似,肉眼看不出有多大差异,但是当检查生成的60*60图像时,它确实不好,200*200图像上的单词几乎无法识别(预期的60*60不是这样),因此我想找到一种更好的方法来让图像具有更好的视图。请记住,质量将以指数速度下降,而不是线性速度下降。例如,质量/分辨率为200x200的一半的图片不是100x100,而是141x141。100x100是200x200分辨率的四分之一,分辨率的指数下降意味着当你达到60x60时,它的分辨率不到十分之一,因此质量也不高。我认为你从你的艺术设计师那里得到的60x60图像与你使用的工艺不同,即你的60x60经历了两次尺寸调整和质量损失,而另一次只有一次。我认为你是对的。希望如此只要我能说服我的老板,不管怎样,我已经为他准备了一个最清晰的预览。我使用的方法是:img=imgl.resize(宽度、高度、Magick::SincFilter)img.write(新图片名称)do self.compression=Magick::ZipSCompression self.quality=100;end