我有一个SVG文件,它的定义大小为16x16。当我使用image magick的convert程序将其转换为PNG时,我会得到一个16x16像素的PNG,它太小了:
1
| convert test.svg test.png |
我需要指定输出PNG的像素大小。-size参数似乎被忽略,-scale参数在转换为png后缩放png。到目前为止,我使用-density参数得到了最好的结果:
1
| convert -density 1200 test.svg test.png |
但我不满意,因为我想在不进行计算密度值的数学运算的情况下以像素为单位指定输出大小。所以我想这样做:
1
| convert -setTheOutputSizeOfThePng 1024x1024 test.svg test.png |
那么我在这里要用到的魔法参数是什么呢?
- 例如,-size 1024x1024工作正常,您的imagemagick版本是什么?
- ImageMagick版本为6.6.9.7。也许这取决于SVG?我的SVG在标题中定义了一个16x16的固定大小,所有坐标都是绝对值,而不是百分比值或类似的值。
- superuser.com/questions/516095/…
- 图像magick-6.9.0-q16。转换-调整1024x1024 foo.svg foo.png的大小可以。
- @济超江户十一〔1〕只是对转换后的图像进行了拉伸处理,质量较差。
- convert -size 1024x1024 test.svg test.png与ImageMagick 7.0.7-0 Q16(Windows巧克力回购的当前版本)配合使用效果良好。只需确保-size出现在输入文件名之前,否则16x16图片将被升序以产生模糊的结果。
- 当涉及到SVG转换时,fyi imagemagick非常糟糕。例如,它的文本定位被破坏。我发现一个更好的选择是使用一个节点模块来利用幻象,比如svg2png。
在本例中,我无法从ImageMagick获得良好的效果,但Inkscape在Linux和Windows上做得很好:
1
| inkscape -z -e test.png -w 1024 -h 1024 test.svg |
下面是使用此命令将16x16 SVG缩放为200x200 PNG的结果:
仅供参考,我的Inkscape版本(在Ubuntu 12.04上)是:
1
| Inkscape 0.48.3.1 r9886 (Mar 29 2012) |
在Windows7上,它是:
1
| Inkscape 0.48.4 r9939 (Dec 17 2012) |
- +1就ImageMagick而言。SVG引擎似乎有问题。在大多数情况下,我不能用它得到准确的结果。Inkscape,Otoh,工作得非常好。
- 我认为Inkscape是继Linux之后最令人印象深刻的一个OSS例子。谢谢你的小费!
- 在OSX上也能很好地工作。
- 伟大的。我的问题不是改变大小,而是ImageMagick将SVG中的透明区域变为PNG中的白色区域。Inkscape可以正确地保持透明度。
- 另一个积极的方面是Inkscape比ImageMagick的转换快得多。
- 您可以使用-d 1200来设置dpi。
- 在OSX上,安装了用于x11的Inkscape,它使用:/Applications/Inkscape.app/Contents/Resources/bin/inkscape -z -e test.png -w 1024 -h 1024 test.svg为我工作。
- 注意:Inkscape在导出时似乎没有考虑纵横比的选项。如果需要,可以尝试使用rsvg或rsvg-convert。
- @r&246;rd要使用ImageMagick保持背景透明,请使用-background none命令行选项。
- Inkscape是个坏蛋。在mac设置上,别名alias inkscape="/Applications/Inkscape.app/Contents/Resources/bin/inkscape"
- 这在OSX上非常有效。我用自制的木桶(caskroom.io)安装了inkscape,命令从盒子里发出。
- 我可以在OSX上安装它,使用自制的brew install homebrew/x11/inkscape
- @Denilsons&225;:如果只指定宽度或高度,Inkscape将保持纵横比。
- 同样值得一提的是,使用Inkscape设置白色背景,而不是默认的透明度:-b white。
- 好的解决方案。唯一的问题是它显示了我想要转换的每个图像的GUI提示。抑制这种情况的正确方法是什么?编辑:没关系,我的命令错了。正确地编写它不会产生任何类型的输出。
- OS X上的最新版本更改了当前工作目录。我认为这是有充分理由的,但这意味着您需要为文件参数使用绝对路径。
- 使用这种方法构建并没有这个问题:inkscape.org/en/download/mac os/alternative install 0.92听起来像是安装在/usr/local/bin/inkscape中作为二进制文件,还是作为更改CWD和exec的脚本作为/Applications中的二进制文件。
- 使用bash和inkscape在一行中进行批转换:如果要将目录中的所有SVG文件转换为特定大小(30x30):for file in *.svg; do inkscape -z -e"${file/.svg/.png}" -w 30 -h 30 $file; done。
- Inkscape破坏了我的SVG。它就像忽略了转换声明,但也打印了一些黑色的东西,这些东西在正确渲染时没有背景色。
- @我以前从来没有见过这样的情况,所以我不确定可能是什么问题。上述评论之一建议使用-background none保持透明度。我也四处看看,发现有一个墨景虫,你可能会碰到…
- 当然,这个bug可以解释一些元素的黑色背景。没有被转换的文本也有点可怕,但是svgexport也在这样做,所以目前我转换的最佳方法是使用phantomjs。
- imho,墨景是垃圾。尝试用BREW安装它,首先安装了大量的依赖项,然后在最终的make期间挂起20分钟。现在我无法摆脱它
- 只需添加一个注释:您可以在宽度和高度之间使用单个参数,其他参数将自动缩放。例如,您可以只使用-w 1024,而-h将自动缩放。
尝试SvgEx销:
1 2
| svgexport input.svg output.png 64x
svgexport input.svg output.png 1024:1024 |
svgexport是一个简单的跨平台命令行工具,我为将svg文件导出到JPG和PNG而制作的,有关更多选项,请参阅此处。要安装svgexport,请安装npm,然后运行:
1
| npm install svgexport -g |
编辑:如果您发现图书馆有问题,请在Github上提交,谢谢!
- svgexport对我来说很有用。输出与浏览器渲染的匹配程度要比ImageMagick高得多。
- svgexport的质量真的很高。现在它成了我最喜欢的工具,谢谢沙基巴!:)
- 这对我也很管用。与在图形用户界面工具中手动操作相比,它节省了实时时间。很难在Mac上找到一个能很好地处理SVG的更便宜的图形用户界面应用程序。
- Svgexport在OSX上没有为我做任何事情,只是以空白图像结束。
- 效果很好,但会产生巨大的图像。使用optipng,我可以将文本徽标从3兆字节压缩到约20KB。
- Inkscape在MacOS上做得不好,但这一个做得很好!
- 不适用于SVG中的图像。
- @Timmm你能举个例子在Github上提交一个问题吗?
- 事实上,我认为这可能有效;结果证明我的SVG依赖于隐式图像维度,这是(我认为)SVG 2的一部分。Chrome使它们很好,但我猜它们已经开始实现SVG 2了。
- @Alishakiba你能指导我如何在Windows上使用它吗?更好的是,如果您能告诉我如何在我的Visual Studio 2015应用程序中使用您的代码?
- @你能在Github上打开一个问题吗?很难在评论中加以讨论。
- @艾莉沙基巴就是这么做的。这个问题在Github上公开。
- evgexport根据大小创建巨大的png文件。建议使用svg2png,它也使用phantomjs进行导出,但创建的图像要小得多。
- 它支持SVG标记转换吗?
- 同意@aron_h的说法,我尝试了两种方法,svg2png做得更好。svgexport生成了一个巨大的308 kb文件,而svg2png生成的质量相同的文件为25 kb。
这不是完美的,但它确实起到了作用。
1
| convert -density 1200 -resize 200x200 source.svg target.png |
基本上,它增加了足够高的dpi(只是使用一个受过教育的/安全的猜测),调整大小是以足够的质量完成的。我试图找到一个合适的解决办法,但过了一段时间后,我觉得这已经足够满足我目前的需要了。
Note: Use 200x200! to force the given resolution
- 在我的例子中,不透明度和阴影消失了。
- 我没有复杂的SVG,所以这对我有用。-resize 200%不起作用,我必须以像素为单位指定大小。
- @Jiyinyiyong使用ImageMagick保持背景透明,使用-background none命令行选项。为了保持图像比例,您也只能指定一个尺寸,例如宽度为-resize 200,高度为-resize x200。请参阅:imagemagick.org/script/command line processing.php geometry以获取详尽的imagemagick几何选项。
- 也不适合我。结果很模糊。
- (这适用于Linux,可能适用于Windows)如果您在IM上打开-verbose,那么似乎IM本身使用inkscape创建一个中间eps文件。因此,我建议按照@808sound的建议直接使用inkscape
- 批处理版本为for file in ./*.svg; do convert -density 1200 -background none -resize 200x200 $file `basename $file .svg`.png; done。
如果您在MacOSX上,并且ImageMagick的转换有问题,您可以尝试用rsvg lib重新安装它。使用自制软件:
1 2
| brew remove imagemagick
brew install imagemagick --with-librsvg |
验证其授权是否正确:
1 2 3 4 5
| $ convert -version
Version: ImageMagick 6.8.9-8 Q16 x86_64 2014-12-17 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2014 ImageMagick Studio LLC
Features: DPC Modules
Delegates: bzlib cairo fontconfig freetype jng jpeg lcms ltdl lzma png rsvg tiff xml zlib |
应显示rsvg。
- 不适合我。具体来说,我运行了convert ic_comment_48px.svg -size 30x30 ic_comment_30px.png,输出图像是48 x 48。确保imagemagick正在委派给rsvg,正如您所解释的那样。
- 对我来说效果很好——默认的convert确实将svg转换为png,但是结果是无望的;重新安装后,它们是完美的。此外,转换速度也明显加快。
- 这让我对Mac OSX很感兴趣。我没有发现新的转换速度更快,但更准确。我强烈建议所有Mac OSX用户尝试一下。
- 这应该是公认的答案,哦,好吧。谢谢你,干得很有魅力,否则我永远不会知道该怎么做。
- 这个答案仍然有很大的帮助,同时也是奥斯陆高地。
- 在莫哈韦,我得到了埃多克斯(6)
当SVG单元不是px时(例如cm),Inkscape似乎不起作用。我得到一张空白的图片。也许,可以通过旋转DPI来修复,但这太麻烦了。
svgexport是一个node.js程序,因此通常不有用。
ImageMagick的Convert工作正常:
1
| ~$ convert -background none -size 1024x1024 infile.svg outfile.png |
如果使用-resize,则图像模糊,文件大得多。
最好的
1
| ~$ rsvg -w 1024 -h 1024 infile.svg outfile.png |
它速度最快,依赖性最小,输出比转换小30%。安装librsvg2-bin获取。似乎没有主页,但您可以键入:
去寻求帮助。简单就是好。
- 这很容易是最好的答案(我不知道为什么20个不同的答案会给出相同的ImageMagick响应);它保留了颜色和阴影,并且不会损坏任何东西。但是,为了匹配ImageMagick的调整大小行为(特别是,wxh意味着缩放图像以适合该大小的框,保留纵横比),应将-a参数与rsvg一起使用。
- 这把我的图像弄得一团糟,各种奇怪的艺术品。Inkscape做得更好。
- 请注意,OSX上的brew install rsvg安装了一百万个东西——gdk、openssl、python等。
- 仅供参考,当前安装命令是brew install librsvg,转换命令是rsvg-convert。
按照Jose Alban的回答中的步骤,我可以使用以下命令让ImageMagick正常工作:
1
| convert -density 1536 -background none -resize 100x100 input.svg output-100.png |
1536来自于对密度的大致估计,更多信息请参见此答案。
为了重新缩放图像,应使用选项-density。据我所知,标准密度是72,地图尺寸是1:1。如果希望输出PNG比原始SVG大两倍,请将"密度"设置为72*2=144:
1
| convert -density 144 source.svg target.png |
- 请注意,转换选项必须在输入文件之前。也就是说,convert source.svg -density 144 target.png不会重新缩放图像。
- 实际上,标准密度似乎是90。所以应该是convert -density 180 source.svg target.png。
为什么不尝试使用inkscape命令行,这是我的BAT文件,用于将此目录中的所有SVG转换为png:
FOR %%x IN (*.svg) DO C:\Ink\App\Inkscape\inkscape.exe %%x -z --export-dpi=500 --export-area-drawing --export-png="%%~nx.png"
我来写这篇文章——但是我只想成批快速地进行转换,而不使用任何参数(由于有几个文件大小不同)。
1
| rsvg drawing.svg drawing.png |
对我来说,要求可能比原作者要简单一些。(希望在MS PowerPoint中使用SVG,但不允许)
- 作为参考,在MacOS上,它与brew install librsvg一起安装,转换命令是rsvg-convert。
有一件事让我有点恼火,那就是在输入文件名后面设置-density。那不管用。将它移动到convert中的第一个选项(在其他任何操作之前)使它工作(对于我、ymmv等)。
我通过更改标记的width和height属性来匹配我的预期输出大小,然后使用imagemagick转换它来解决这个问题。很有魅力。
下面是我的python代码,一个返回JPG文件内容的函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| import gzip, re, os
from ynlib.files import ReadFromFile, WriteToFile
from ynlib.system import Execute
from xml.dom.minidom import parse, parseString
def SVGToJPGInMemory(svgPath, newWidth, backgroundColor):
tempPath = os.path.join(self.rootFolder, 'data')
fileNameRoot = 'temp_' + str(image.getID())
if svgPath.lower().endswith('svgz'):
svg = gzip.open(svgPath, 'rb').read()
else:
svg = ReadFromFile(svgPath)
xmldoc = parseString(svg)
width = float(xmldoc.getElementsByTagName("svg")[0].attributes['width'].value.split('px')[0])
height = float(xmldoc.getElementsByTagName("svg")[0].attributes['height'].value.split('px')[0])
newHeight = int(newWidth / width * height)
xmldoc.getElementsByTagName("svg")[0].attributes['width'].value = '%spx' % newWidth
xmldoc.getElementsByTagName("svg")[0].attributes['height'].value = '%spx' % newHeight
WriteToFile(os.path.join(tempPath, fileNameRoot + '.svg'), xmldoc.toxml())
Execute('convert -background"%s" %s %s' % (backgroundColor, os.path.join(tempPath, fileNameRoot + '.svg'), os.path.join(tempPath, fileNameRoot + '.jpg')))
jpg = open(os.path.join(tempPath, fileNameRoot + '.jpg'), 'rb').read()
os.remove(os.path.join(tempPath, fileNameRoot + '.jpg'))
os.remove(os.path.join(tempPath, fileNameRoot + '.svg'))
return jpg |
- 你为什么要把电脑生成的图像以jpeg的形式返回:(?
对于简单的svg到png转换,我发现cairosvg(https://cairosvg.org/)的性能优于imagemagick。在目录中的所有SVG文件上安装和运行的步骤。
在包含.svg文件的目录中打开python shell并运行:
1 2 3 4 5
| import os
for file in os.listdir('.'):
name = file.split('.svg')[0]
cairosvg.svg2png(url=name+'.svg',write_to=name+'.png') |
这还将确保不会覆盖原始的.svg文件,但会保持相同的名称。然后,您可以将所有.png文件移动到另一个目录,方法是:
1
| $ mv *.png [new directory] |
- 在Windows 10上为我崩溃:将cairocfi导入cairo文件"c:program files(x86)python35-32libsite packagescairocfi_init_y",行39,位于cairo=dlopen(ffi,'cairo','cairo-2','cairo-gobject-2','cairo.so.2')文件"c:program files(x86)python35-32libsite packagescairocfi_init_y",行36,位于dlopen rais中e oserror("dlopen()未能加载库:%s"%"/"。join(name))oserror:dlopen()未能加载库:cairo/cairo-2/cairo-gobject-2/cairo.so.2
@808Sound的最佳答案不适合我。我想调整大小
并且得到
所以我打开了Inkscape,然后去了File,Export as PNG file,弹出了一个GUI框,允许我设置所需的确切尺寸。
Ubuntu 16.04 Linux上的版本:Inkscape 0.91 (September 2016)
(顺便说一下,这张图片来自肯尼荷兰的资产包)