目前,我正在使用rsvg加载svg(从字符串,而不是从文件)并绘制到cairo。任何人都知道更好的方法?我在我的应用程序的其他地方使用PIL,但我不知道用PIL做这件事的方法。蟒蛇服务器端SVG到PNG(或其他一些图像格式)
回答
这是我目前有:
import cairo
import rsvg
def convert(data, ofile, maxwidth=0, maxheight=0):
svg = rsvg.Handle(data=data)
x = width = svg.props.width
y = height = svg.props.height
print "actual dims are " + str((width, height))
print "converting to " + str((maxwidth, maxheight))
yscale = xscale = 1
if (maxheight != 0 and width > maxwidth) or (maxheight != 0 and height > maxheight):
x = maxwidth
y = float(maxwidth)/float(width) * height
print "first resize: " + str((x, y))
if y > maxheight:
y = maxheight
x = float(maxheight)/float(height) * width
print "second resize: " + str((x, y))
xscale = float(x)/svg.props.width
yscale = float(y)/svg.props.height
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, x, y)
context = cairo.Context(surface)
context.scale(xscale, yscale)
svg.render_cairo(context)
surface.write_to_png(ofile)
欢迎来到Stackoverflow!一般的经验法则是,如果你发布的是解决问题的方法,那么它可能是一个答案;如果是上下文或试图解决不起作用的问题,或者认为被黑客入侵是一个很好的答案,那么它应该作为编辑来解决问题。事实上,这段代码似乎是你想要获得评论的'你正在做的'(“任何人都知道更好的方法”),而不是解决问题的方法,这表明这应该是你的问题。 – 2010-05-28 22:02:26
里面有一些错误。当你创建一个ImageSurface时,你需要Integer'表面= cairo.ImageSurface(cairo.FORMAT_ARGB32,round(int(x)),round(int(y))'你应该确保maxwidth和maxheight总是被设置为一个高数字这会比0更好我有很多SVG的高度是32000,这会导致内存错误 – therealmarv 2011-12-09 04:49:51
如何imagemagic? - http://www.imagemagick.org/script/magick-vector-graphics.php它可以读/写标准输入/标准输出,所以你可以将它与你的应用程序集成,即使你不想使用文件
2010年5月以前的ImageMagick'convert'版本在解释SVG方面做了很糟糕的工作,就像他们还没有得到SVG支持一样正常工作(虽然我没有建立它看) – msw 2010-05-28 22:29:01
我已经安装了inkscape,所以我只是将这个过程用于inkscape与inkscape -f file.svg -e file.png
使用此代码的命令:
import subprocess
inkscape_dir=r"C:\Program Files (x86)\Inkscape"
assert os.path.isdir(inkscape_dir)
os.chdir(inkscape_dir)
subprocess.Popen(['inkscape.exe',"-f",fname,"-e",fname_png])
我在Windows 7中,并得到了Windows的5错误[拒绝访问(或类似的东西),直到我切换到Inkscape的目录
考虑将'cwd = inkscape_dir'传递给'Popen',而不是改变父进程的目录。 – 2011-10-01 20:06:06
你也可以
phantomjs rasterize.js http://ariya.github.com/svg/tiger.svg tiger.png
或者从使用Python中的硒:对于这个电子PhantomJS(见http://phantomjs.org/screen-capture.html)
从外壳
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.set_window_size(1024, 768)
driver.get('http://ariya.github.com/svg/tiger.svg')
driver.save_screenshot('tiger.png')
- 1. 一般蟒蛇服务器
- 2. 将swf呈现为PNG或其他图像格式
- 3. 将LaTeX表格直接打印到图像(PNG或其他)
- 4. 蟒蛇Django的服务器
- 5. 蟒蛇和SQL服务器
- 6. 格式蟒蛇
- 7. 如何将jQuery FLOT图形保存为.png或其他图像格式?
- 8. 将图像上传到同一服务器上的其他域
- 9. 追加内容到其他蟒蛇
- 10. 使用PNG或SVG图像为
- 11. SVG图像格式
- 12. 如何将SVG文件转换为其他图像格式
- 13. 日期格式及其在蟒蛇
- 14. FFImageLoading一些PNG的URL不显示图像,而其他显示图像
- 15. SVG至PNG服务器端 - 如何使用Node.js
- 16. SVG到服务器端的JSON?
- 17. 合并透明PNG图像与其他PNG图像 - PHP
- 18. 蟒蛇OpenCV图像变换或更好
- 19. 动画SVG不打一台服务器上,但玩的其他
- 20. 上传图像和其他参数到服务器
- 21. 服务器端D3 - SVG编码为Base64编码的图像
- 22. 格式化并结合与其他数据的机器学习蟒蛇
- 23. 转换圣拉斐尔SVG到图像(PNG等)的客户端
- 24. 蟒蛇行编辑telnet服务器
- 25. 蟒蛇cx_oracle和服务器信息
- 26. 删除蟒蛇HTTP服务器缓存
- 27. 蟒蛇流RPC服务器与RPC
- 28. openerp服务器动作 - 蟒蛇代码
- 29. 高效蟒蛇聊天服务器
- 30. 蟒蛇插槽服务器 - 听即使客户端断开
PIL不支持SVG;一个快速的冲浪表明你可能有正确的工具链。 – msw 2010-05-28 22:30:24
我刚刚在这里发布了关于此的更新评论 - http://stackoverflow.com/a/19718153/542550 - 下面的评论指出“ImageMagick支持似乎很糟糕”,但该评论者没有构建它/测试它。现在是2013年10月,我刚刚使用ImageMagick进行了测试(通过Wand-py)导入了各种各样的SVG,并且效果很好!我仍然有更多的测试要做,如果我真的犯了错误,我肯定会把这个评论拉下来,但是现在它已经在一些SVG上完美地工作了,这些SVG被称为使用其他方法的越野车。 – streetlogics 2013-10-31 23:12:51