我使用RMagick的resample
方法来改变我所拥有的图像的DPI分辨率(从300x300
到72x72
)。
我使用的代码是这样的:
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