Я хочу отобразить в фрейме 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()
В настоящее время wxPython основан на wxWidgets 3.2, который использует nanosvg для рендеринга изображений SVG. nanosvg не поддерживает размытие по Гауссу. wxWidgets 3.3 будет иметь новую библиотеку рендеринга SVG, однако размытие по Гауссу в настоящее время не поддерживается и в этой библиотеке.
Спасибо за Ваш ответ. Знаете ли вы о какой-либо библиотеке рендеринга SVG, которая поддерживает размытие по Гауссу и может взаимодействовать с wxPython?