【问题标题】:setting density upon image read with RMagick使用 RMagick 读取图像时设置密度
【发布时间】:2011-06-04 15:15:36
【问题描述】:

我正在尝试使用 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。

【问题讨论】:

    标签: ruby vector svg imagemagick rmagick


    【解决方案1】:

    密度与分辨率有关(即每英寸的点数),而不是渲染尺寸。来自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 可能不仅仅是设置密度。

    如果 resize 没有为您解决问题(并且,根据您的 cmets,它发生得太晚而无法使用),您可以尝试在块中设置 size parameter

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

    当然,您必须事先知道 SVG 有多大。您应该能够为几何指定诸如 200%x200% 之类的东西,但是当我尝试时,read 总是忽略 Magick::Geometry 上的标志。

    【讨论】:

    • 如果我只是在进行光栅到光栅的转换,那么调整大小肯定是我想要的。但是如果我在读取 SVG 后调整大小,我会放大光栅图像,所以我会得到你所期望的 nasty antialiasing artifactsconvert 命令似乎首先将 SVG 光栅化为更大的图像,从而产生 properly smooth lines
    • 它不允许我编辑我的评论,但我想提一下a thread I found in the ImageMagick forums,它说-density 的用途之一是指定矢量图像的读取密度。显然它对 RMagick 的含义与convert 的含义不同。
    • @hynkle:看看我的更新。您应该能够为opts.size 指定百分比几何形状,但我无法让它工作或产生一条错误消息告诉我为什么它不起作用。这对于我与 ImageMagick 的交互来说是非常典型的:如果你能让它工作,那就是很棒的库,糟糕的界面。
    • @muistooshort 这似乎不再起作用了。我已经尝试过了,但更改 opts.size 不会影响任何事情。
    猜你喜欢
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多