我想把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 "中进一步传递。
你还没有说你想用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图片。