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



我使用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,文件大小实际上也不会改变。

试试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。我还没见过300dpi的图像。

改变文件的分辨率不会(也不应该)改变文件大小。分辨率是每英寸的点数,而文件大小是由实际像素数决定的(在控制了文件大小、压缩等其他因素之后),而不管它们消耗了多少英寸。

如果你想改变你的图像的分辨率(即什么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)

老问题,但我遇到了一个类似的问题,显然,这仍然是一个问题。改变图像的密度并不能解决问题,除非也指定了单位(默认是UndefinedResolution,不像文档中所说的,这里)。在设置密度之前设置单位对我来说是有效的(反之则不然)。在上面的例子中,它应该是这样的:

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

最新更新