RMagick的重采样方法调整图像大小,而不是重新采样(DPI分辨率不会改变)

时间:2011-08-02 13:31:21

标签: ruby imagemagick rmagick

我正在使用RMagick的resample方法来更改我拥有的图片的DPI分辨率(从300x30072x72

我使用它的代码:

original_image = Magick::Image.read("my300x300file.jpg") { self.density = "72.0x72.0" }
original_image.each do |image|
   image = image.resample(72.0, 72.0)
   image.density = "72x72"
   image.write("my72x72file.jpg") { self.quality = 50 }
end

执行代码后,my72x72file.jpg 尺寸已减少,但其 DPI分辨率仍为300(表示文件)大小并没有减少太多;实际上,即使我将self.quality设置为0,文件大小也会不会发生变化。

3 个答案:

答案 0 :(得分:1)

尝试image = image.resize_to_fit!(72.0, 72.0)
而不是image = image.resample(72.0, 72.0)

resize_to_fit更改图像的尺寸,而resample更改图像的分辨率(dpi)。通常分辨率为96 dpi或72 dpi。我没有看到300 dpi的图像。请试一试。

答案 1 :(得分:1)

更改文件的分辨率不会(也不应该)更改文件大小。分辨率是每英寸的点数,而文件大小是根据实际像素的数量确定(在控制其他所有内容,如文件大小,压缩等)后,无论它们消耗多少英寸。

如果你想改变你的图像的分辨率(即Photoshop,GIMP等说它是什么),我发现唯一有效的方法是创建一个具有适当分辨率的新图像,然后合成你的原始图像在它上面。这似乎适得其反,但这是我能让它完全发挥作用的唯一方式。

示例代码:

image = Magick::Image.read("my300x300file.jpg").first
dpi_image = Magick::Image.new(image.columns, image.rows) {
    self.density = "72x72"
    self.background_color = "none"
}
image = dpi_image.composite(image, Magick::CenterGravity, Magick::OverCompositeOp)

答案 2 :(得分:0)

老问题,但我遇到了类似的问题,显然,这仍然是一个问题。更改图像上的密度并不能解决问题,除非还指定了单位(默认为UndefinedResolution,与文档here中所述的不同)。在为我设置密度之前设置单位(反过来没有)。在上面的例子中,它应该是这样的:

original_image = Magick::Image.read("my300x300file.jpg") { self.density = "72.0x72.0" }
original_image.each do |image|
    image = image.resample(72.0, 72.0)
    image.units = Magick::PixelsPerInchResolution
    image.density = "72x72"
    image.write("my72x72file.jpg") { self.quality = 50 }
end