Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305

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

16.09.2018, 18:56. Показов 3576. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть ли какой-то способ преобразовать svg (хранится в программе в виде объекта lxml.etree) в bitmap, чтобы потом вывести через DrawBitmap для на wx.GCDC. Сейчас это делается через Rsvg из gi.repository (PyGObject). Возможно есть какое-то другое решение?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.09.2018, 18:56
Ответы с готовыми решениями:

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

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

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

8
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
16.09.2018, 20:03
Да, в общем, так и делвется, svg преобразовывается в изображение какой-нибудь библиотекой и выводится, только почему выбрали Rsvg? Обычно берут CairoSVG
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
16.09.2018, 20:31  [ТС]
Табурет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
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
16.09.2018, 20:56
Лучший ответ Сообщение было отмечено 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
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
16.09.2018, 21:41  [ТС]
Табурет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
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
16.09.2018, 21:46
Вот обсуждается подобная ошибка https://github.com/Kozea/CairoSVG/issues/194
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
16.09.2018, 22:24  [ТС]
Лучший ответ Сообщение было отмечено Табурет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
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
14.10.2018, 20:44  [ТС]
Цитата Сообщение от ТабуретY Посмотреть сообщение
только почему выбрали Rsvg
Как оказалось, CairoSVG с текстом работать не умеет.
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
26.07.2019, 11:14  [ТС]
UPD: CairoSVG с текстом работать умеет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.07.2019, 11:14
Помогаю со студенческими работами здесь

Преобразовать SVG в PNG на сервере
Посоветуйте, чем можно преобразовать SVG в PNG на сервере БЕЗ использования headless browser-ов типа PhantomJS или Crhomium. Вроде как...

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

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

Как преобразовать Bitmap в массив?
задача такая, есть picutrebox в нем загружена картинка ч\б, как обратится picutrebox что бы считать с некго каждый пиксель и записать в int...

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru