如何在Python中把SVG转换为BMP?

问题描述 投票:1回答:1

我想把svg转换成bmp,以便进一步处理(自定义qr-code),我发现我需要这样做。

import cairosvg
import wx
import io

png = cairosvg.svg2png(url="test.svg", write_to="test.png")
img = wx.Image(io.StringIO(png),wx.BITMAP_TYPE_PNG)
bmp = wx.Bitmap(img)

Debug说:

18:34:58: Error: This is not a PNG file.
Traceback (most recent call last):
File "svg2bmp5.py", line 7, in <module>
bmp = wx.Bitmap(img)
wx._core.PyNoAppError: The wx.App object must be created first!

但是 "test.png "是由cairosvg创建的,请帮助我。

Rolf of Saxony建议增加bmp的目标。我想实现jast只有*.bmp-文件,以便在 "potrace "中进一步传递。

例子:我正试图将svv.bmp-文件转换为svv.bmp-文件,以便在 "potrace "中进一步传递。custom QR-code

python-3.x image svg wxpython bmp
1个回答
1
投票

你还没有说你想用wxPython部分的代码实现什么。如果你只是想显示它,可以试试下面的方法。

import cairosvg
import wx

class TestFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)
        cairosvg.svg2png(url="test.svg", write_to="test.png")
        img = wx.Image('test.png',wx.BITMAP_TYPE_PNG)
        self.Image = wx.StaticBitmap(self, bitmap=wx.Bitmap(img))
        box = wx.BoxSizer(wx.VERTICAL)
        box.Add(self.Image, 0, wx.ALL, 10)
        self.SetSizer(box)
        self.Fit()
        self.Show()

if __name__ == "__main__":
    app = wx.App()
    frame = TestFrame(None)
    app.MainLoop()

你不应该使用 io.StringIO() 关于 png 因为 cairosvg.svg2png(url="test.svg", write_to="test.png") 创建一个文件,因此 png 其实 None,而不是一个图像。记住 print( your problem ) 在此 png它是你的朋友 它会告诉你这个东西是什么。为了更加清晰,使用 print(repr( xx ))print(type( xx ))

编辑:根据你的评论,下面的方法可能会有帮助。

import cairosvg
import wx

class TestFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)
        cairosvg.svg2png(url="test.svg", write_to="test.png")
        img = wx.Image('test.png')
        img.ConvertAlphaToMask(255,255,255)
        bmp = wx.Bitmap(img)
        self.Image = wx.StaticBitmap(self, bitmap=bmp)
        self.Image.Bitmap.SaveFile('test.bmp', type=wx.BITMAP_TYPE_BMP)
        box = wx.BoxSizer(wx.VERTICAL)
        box.Add(self.Image, 0, wx.ALL, 10)
        self.SetSizer(box)
        self.Fit()
        self.Show()

if __name__ == "__main__":
    app = wx.App()
    frame = TestFrame(None)
    app.MainLoop()

在保存为bmp文件之前先把png文件的透明度去掉 否则整个文件就会变成一个巨大的黑色小块。你的例子图片真的应该是.svg图片而不是.png图片。

© www.soinside.com 2019 - 2024. All rights reserved.