使用RMagick读取图像时的密度

时间:2011-06-04 15:15:37

标签: ruby vector svg imagemagick rmagick

我正在尝试使用RMagick将SVG转换为不同大小的PNG。

当我使用Magick::Image.read('drawing.svg')读取SVG并将其写入drawing.png(相当于从命令行运行convert drawing.svg drawing.png)时,大小为744x1052。

假设我希望PNG的默认值是原来的两倍。你不能只是阅读它,调整大小,然后把它写出来,因为它首先光栅化SVG,然后将图像缩放到两倍大,失去质量和首先使用矢量图形的全部好处。相反,如果我理解正确,你应该在读取时设置图像的密度。

image = Magick::Image.read('drawing.svg'){self.density = 144}.first

但是image.density仍然将密度报告为“72x72”,如果我写出图像,它的大小与之前相同,为744x1052。在读取时如何指定密度似乎并不重要。 144,“144”,144.0,“144.0”,“144x144”和“144.0x144.0”,它总是回来“72x72”。

从命令行运行convert -density 144 drawing.svg drawing.png按预期工作,并生成一个比以前大两倍的PNG,2104x1488。

我使用的是OS X 10.6.7,ImageMagick 6.7.0-0(通过MacPorts安装),RMagick 2.13.1和Ruby 1.9.2p180。当我将我的代码放到Heroku上的一个小Sinatra webapp的上下文中时,它具有相同的错误行为,因此问题似乎不在于OS X或MacPorts。

1 个答案:

答案 0 :(得分:4)

密度大约是分辨率(即每英寸点数),而不是渲染大小。来自fine manual

  

图像的垂直和水平分辨率(以像素为单位)。默认值为“72x72”。

我认为您正在寻找resizeresize!

  

将接收器的大小更改为指定的尺寸。

     

您可以通过两种方式指定新尺寸。明确指定新的宽度和高度,或指定比例因子,表示百分比变化的数字。

所以这会奏效:

Magick::Image.read('drawing.svg').first.resize(2).write('drawing.png')

或者这个:

img = Magick::Image.read('drawing.svg').first
img.resize!(2)
img.write('drawing.png')

我不知道为什么convert的行为与库不同,可能还有其他默认设置在库中具有不同的默认设置,或者-density可能不仅仅设置密度。< / p>

如果resize没有为你做这个伎俩(并且根据你的评论,它发生得太晚而无法使用),你可以尝试在块中设置size parameter

img = Magick::Image.read('drawing.svg'){ |opts| opts.size = '2104x1488' }.first

当然,你必须知道SVG有多大。您应该可以为几何图形指定200%x200%之类的内容,但{I} read在我尝试时始终忽略Magick::Geometry上的标记。