Отобразить SVG с размытием по Гауссу в wxPython

Я хочу отобразить в фрейме wxPython изображение SVG, использующее feGaussianBlur. В следующем примере показано изображение, но размытие по Гауссу не применяется. Я проверил код SVG, все в порядке.

Обратите внимание, что это минимальный тест, но я намерен использовать этот код в контексте, где код SVG не хранится в файле, а генерируется каким-либо кодом. Кроме того, цвет фона необходимо установить вне кода SVG.

Я делаю что-то неправильно? Или мне следует переключиться на другой рендерер, кроме wx.svg?

import wx
import wx.svg
import numpy as np
import utils

class MyClass(wx.Frame):
    def __init__(self, parent, title):
        super(MyClass, self).__init__(parent, title=title, size=(400, 400))
        
        self.svg_filename = "uiIcons\\Smart_views\\Dance.svg"
        self.backgroundColor = "rgb(255,0,0,255)"
        self.foregroundColor = "rgb(0,0,255,255)"
        
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        self.Show()
    
    def OnPaint(self, event):
        dc = wx.PaintDC(self)
        width, height = self.GetSize()
        
        buffer = wx.Bitmap(width*2, height*2)
        pdc = wx.BufferedPaintDC(self, buffer)
        try:
            dc = wx.GCDC(pdc)
        except:
            dc = pdc
        
        dc.SetPen(wx.TRANSPARENT_PEN)
        
        dc.SetBrush(wx.Brush(self.backgroundColor))
        dc.DrawRectangle(0, 0, height, height)
        

        self.blur_bmp = self.CreateBitmapFromSvg(width, height)
        dc.DrawBitmap(self.blur_bmp, 0, 0)
        
    
    def CreateBitmapFromSvg(self, width, height):
        svg = """
    <?xml version = "1.0" ?>
    <svg width = "300" height = "300" xmlns = "http://www.w3.org/2000/svg">
        <defs id = "defs1">
            <filter
                xmlns = "http://www.w3.org/2000/svg" id = "gaussianblur" x = "0" y = "0">
                <feGaussianBlur in = "SourceGraphic" stdDeviation = "5"/>
            </filter>
        </defs>
         <rect x = "50" y = "50" width = "200" height = "200" fill = "blue" filter = "url(#gaussianblur)"/>
    </svg>
        """
        
        img = wx.svg.SVGimage.CreateFromBytes(str.encode(svg))
        
        dcdim = height/2
        imgdim = max(img.width, img.height)
        scale = dcdim / imgdim
        imgwidth = int(img.width * scale)
        imgheight = int(img.height * scale)
        x = int((width-imgwidth)/2)
        y = int((height-imgheight)/2)
        
        bmp = img.ConvertToBitmap(scale=scale, width=imgwidth, height=imgheight)
        
        return bmp

if __name__ == '__main__':
    app = wx.App()
    frame = MyClass(None, "Mon application")
    app.MainLoop()
Создание фильтров для вашего сайта
Создание фильтров для вашего сайта
Фильтры - удобный инструмент в арсенале веб-дизайнера. Они позволяют изменять элементы на странице с помощью всего нескольких строк кода. Эти...
Анимация SVG-узоров без единой строки CSS
Анимация SVG-узоров без единой строки CSS
Недавно я работал над веб-проектом, который позволил мне поэкспериментировать с шаблонами SVG. С SVG очень приятно работать, как только вы получите...
Как использовать d3.js для рисования 2D SVG-элементов в приложении Angular?
Как использовать d3.js для рисования 2D SVG-элементов в приложении Angular?
D3.js - это обширная библиотека, используемая для привязки произвольных данных к объектной модели документа (DOM). Мы разберем основные варианты...
0
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В настоящее время wxPython основан на wxWidgets 3.2, который использует nanosvg для рендеринга изображений SVG. nanosvg не поддерживает размытие по Гауссу. wxWidgets 3.3 будет иметь новую библиотеку рендеринга SVG, однако размытие по Гауссу в настоящее время не поддерживается и в этой библиотеке.

Спасибо за Ваш ответ. Знаете ли вы о какой-либо библиотеке рендеринга SVG, которая поддерживает размытие по Гауссу и может взаимодействовать с wxPython?

Benco 18.07.2024 11:15

Другие вопросы по теме