【问题标题】:How to convert SVG to BMP in Python如何在 Python 中将 SVG 转换为 BMP
【发布时间】:2020-08-13 15:28:12
【问题描述】:

我正在尝试将 svg 转换为 bmp,以进行进一步处理(自定义二维码) 我发现我需要这样做:

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)

调试说:

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”中进一步传递它。 我需要它来制作自定义二维码。

示例:

【问题讨论】:

    标签: python-3.x image svg wxpython bmp


    【解决方案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()
    

    您不应该在png 上使用io.StringIO(),因为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

    【讨论】:

    • 我需要 bmp 将其保存在文件中以便在“potrace”中进一步处理。谢谢。我在问题中添加了解释。
    • 查看我编辑的答案。也许您可以用实际的 svg 文件替换示例 png 文件。这将使测试更容易。
    猜你喜欢
    • 2021-05-31
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 2018-12-29
    相关资源
    最近更新 更多