Как конвертировать SVG в BMP в Python - PullRequest
2 голосов
/ 29 апреля 2020

Я пытаюсь преобразовать SVG в BMP, для дальнейшей обработки (пользовательский qr-код) я обнаружил, что мне нужно сделать это:

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. Помогите мне, пожалуйста ..

Рольф из Саксонии предложил добавить цель bmp: я хочу получить только * .bmp-файл jast для дальнейшей передачи его в "potrace". Мне это нужно для создания собственного qr-кода.

Пример: custom QR-code

1 Ответ

1 голос
/ 29 апреля 2020

Вы еще не сказали, чего пытаетесь достичь с помощью части кода wx Python.
Если вы просто хотите отобразить это, попробуйте следующее:

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()

Включает удаление прозрачности из файла png перед сохранением в виде BMP, или все это один гигантский черный шарик.
Ваше изображение в качестве примера действительно должно быть изображением .svg, а не .png

...