我正在尝试使用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。
答案 0 :(得分:4)
密度大约是分辨率(即每英寸点数),而不是渲染大小。来自fine manual:
图像的垂直和水平分辨率(以像素为单位)。默认值为“72x72”。
将接收器的大小更改为指定的尺寸。
您可以通过两种方式指定新尺寸。明确指定新的宽度和高度,或指定比例因子,表示百分比变化的数字。
所以这会奏效:
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
上的标记。