Форум программистов, компьютерный форум, киберфорум
Наши страницы
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
ioprst
144 / 105 / 70
Регистрация: 12.03.2018
Сообщений: 407
1

Преобразовать svg в bitmap

16.09.2018, 18:56. Просмотров 1535. Ответов 7
Метки нет (Все метки)

Есть ли какой-то способ преобразовать svg (хранится в программе в виде объекта lxml.etree) в bitmap, чтобы потом вывести через DrawBitmap для на wx.GCDC. Сейчас это делается через Rsvg из gi.repository (PyGObject). Возможно есть какое-то другое решение?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2018, 18:56
Ответы с готовыми решениями:

Преобразовать изображение в SVG
Привет. Возможно странный вопрос (даже не знаю в тот ли раздел форума пишу). Необходимо вставить...

Lxml. Парсинг SVG
Привет. Подскажите, пожалуйста, в чем может быть проблема. С помощью lxml делаю парсинг svg....

Cairosvg SVG to PNG
Traceback (most recent call last): File "test.py", line 1, in <module> from cairosvg import...

Преобразовать svg в pdf
На сайте имеется векторный график svg, при нажатии на кнопку берется код этого графика и передается...

Преобразовать формат svg картинки
Здравствуйте, не нашел подходящего раздела, поэтому пишу сюда. Как сделать из такого формата...

7
ТабуретY
1080 / 748 / 430
Регистрация: 05.12.2013
Сообщений: 2,204
16.09.2018, 20:03 2
Да, в общем, так и делвется, svg преобразовывается в изображение какой-нибудь библиотекой и выводится, только почему выбрали Rsvg? Обычно берут CairoSVG
0
ioprst
144 / 105 / 70
Регистрация: 12.03.2018
Сообщений: 407
16.09.2018, 20:31  [ТС] 3
ТабуретY, экспериментировали в начале проекта. Можно сразу svg преобразовать в bitmap или svg->png->bmp? Просто пока что я смог сделать лишь png в bitmap с последующим выводом на панель.
Кликните здесь для просмотра всего текста

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import wx
from PIL import Image
import os
 
class MainFrame(wx.Frame):
 
    def __init__(self):
        wx.Frame.__init__(self, parent=None, id=wx.ID_ANY, title=wx.EmptyString, pos=wx.DefaultPosition, size=wx.Size( 711,655 ), style=wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL)
 
        self.panel_draw = wx.Panel(self, style=wx.SUNKEN_BORDER|wx.TAB_TRAVERSAL|wx.FULL_REPAINT_ON_RESIZE)
        self.panel_draw.Bind(wx.EVT_PAINT, self.OnPanelDrawRepaint)
 
        self.RefreshPanelDraw()
 
 
    def OnPanelDrawRepaint(self, event):
        dc = wx.PaintDC(self.panel_draw)
        dc.Clear()
        # print(os.path.exists('C:\\Users\Ilya\Desktop\work\icon_open.svg'))
        img = Image.open('icon_open.png')
        
        if len(img.split()) == 4:
            r, g, b, a = img.split()
            img = Image.merge('RGB', (r, g, b))
            img.save('icon_open.bmp')
        else:
            img.save('icon_open.bmp')
        
        bmp = wx.Bitmap('icon_open.bmp', type=wx.BITMAP_TYPE_ANY)
 
        dc.DrawBitmap(bmp, 0, 0)
 
    def RefreshPanelDraw(self):
        self.panel_draw.Refresh()
 
if __name__ == '__main__':
    app = wx.App()
    mainFrame = MainFrame()
    mainFrame.Show()
    app.MainLoop()

Про CairoSVG спасибо, уже натыкался на нее на форумах, но не предал значения. Буду изучать.
0
ТабуретY
1080 / 748 / 430
Регистрация: 05.12.2013
Сообщений: 2,204
16.09.2018, 20:56 4
Лучший ответ Сообщение было отмечено ioprst как решение

Решение

wx.Image может принимать stream, так что можно что-то вроде этого

Python
1
2
3
png = cairosvg.svg2png(svg)
img = wx.Image(StringIO(png),wx.BITMAP_TYPE_PNG)
bmp = wx.Bitmap(img)
1
ioprst
144 / 105 / 70
Регистрация: 12.03.2018
Сообщений: 407
16.09.2018, 21:41  [ТС] 5
ТабуретY, пытаюсь разобраться с cairosvg, но постоянно вылетает ошибка, взял пример с офф. документации:
Python
1
2
print(os.path.exists("icon_open.svg")) # >>> True
png = cairosvg.svg2png(url="icon_open.svg", write_to="output.png")
Bash
1
2
3
File "D:\Program\Python34\lib\urllib\request.py", line 1357, in open_local_file
    raise URLError(exp)
urllib.error.URLError: <urlopen error [WinError 3] Системе не удается найти указанный путь: ''>
Не знаете в чем может быть проблема?

Добавлено через 5 минут
А если указать абсолютный путь к файлу, то
Bash
1
2
3
File "D:\Program\Python34\lib\urllib\request.py", line 1253, in unknown_open
    raise URLError('unknown url type: %s' % type)
urllib.error.URLError: <urlopen error unknown url type: d>
0
ТабуретY
1080 / 748 / 430
Регистрация: 05.12.2013
Сообщений: 2,204
16.09.2018, 21:46 6
Вот обсуждается подобная ошибка https://github.com/Kozea/CairoSVG/issues/194
0
ioprst
144 / 105 / 70
Регистрация: 12.03.2018
Сообщений: 407
16.09.2018, 22:24  [ТС] 7
Лучший ответ Сообщение было отмечено ТабуретY как решение

Решение

ТабуретY, уже побывал здесь, ничего не дало. Ладно, буду копать. Спасибо.

Добавлено через 35 минут
Вот рабочий вариант (может кому-нибудь пригодится):
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import cairosvg
import wx
from io import BytesIO
 
svg = b'<svg xmlns="http://www.w3.org/2000/svg" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xlink="http://www.w3.org/1999/xlink" baseProfile="full" height="100%" version="1.1" width="100%" viewBox="0 0 1024 1024"><defs><style type="text/css">\n    .default_default {\n      fill: #808080;\n      stroke: #000000;\n      stroke-width: 0.5px;\n    }\n</style></defs><g id="root"><rect fill="#ffff00" height="1024" width="1024" x="0" y="0"/><rect fill="#ff0000" height="50" width="50" x="20" y="20"/></g></svg>'
 
class MainFrame(wx.Frame):
 
    def __init__(self):
        wx.Frame.__init__(self, parent=None, id=wx.ID_ANY, title=wx.EmptyString, pos=wx.DefaultPosition, size=wx.Size(711, 655), style=wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL)
 
        self.panel_draw = wx.Panel(self, style=wx.SUNKEN_BORDER|wx.TAB_TRAVERSAL|wx.FULL_REPAINT_ON_RESIZE)
        self.panel_draw.Bind(wx.EVT_PAINT, self.OnPanelDrawRepaint)
 
        self.RefreshPanelDraw()
 
 
    def OnPanelDrawRepaint(self, event):
        dc = wx.PaintDC(self.panel_draw)
        dc.Clear()
 
        png = cairosvg.svg2png(bytestring=svg)
        img = wx.Image(BytesIO(png), wx.BITMAP_TYPE_PNG)
        bmp = wx.Bitmap(img)
 
        dc.DrawBitmap(bmp, 0, 0)
 
    def RefreshPanelDraw(self):
        self.panel_draw.Refresh()
 
if __name__ == '__main__':
    app = wx.App()
    mainFrame = MainFrame()
    mainFrame.Show()
    app.MainLoop()
Обратите внимание! Чтобы все это работало в атрибутах элемента svg обязательно должен быть атрибут viewBox="0 0 size_w size_h".
1
ioprst
144 / 105 / 70
Регистрация: 12.03.2018
Сообщений: 407
14.10.2018, 20:44  [ТС] 8
Цитата Сообщение от ТабуретY Посмотреть сообщение
только почему выбрали Rsvg
Как оказалось, CairoSVG с текстом работать не умеет.
0
14.10.2018, 20:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2018, 20:44

Преобразовать ImageSource в Bitmap
Необходимо получить из переменной ImageSource переменную типа Bitmap, то есть, по сути, вытянуть...

Можно ли преобразовать TextureBrush в Bitmap
Можно ли преобразовать TextureBrush в Bitmap, если можно то как?

Как преобразовать Graphics в Bitmap
Как преобразовать Graphics в Bitmap


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru