我有一个使用Cairo 图像表面的小型 PyGI 项目,然后我使用表面图案对其进行缩放并在 Gtk.DrawingArea 上进行渲染。
我想将缩放版本写入 PNG 文件。我尝试使用Surface.write_to_png()从原始表面写入,但它只写入原始(即非缩放)大小,所以我被困在那里。
然后我想我也许可以从 Gtk.DrawingArea 获取渲染图像并将其写入磁盘,但我还没有找到如何在 PyGI 中做到这一点(这似乎只有在 GTK+ 2 中才有可能 -将 gtk.DrawingArea 保存到文件)。所以我试图弄清楚如何将我的缩放图像写入磁盘。
下面是创建表面、放大和渲染表面的代码:
def on_drawingarea1_draw (self, widget, ctx, data=None):
# 'widget' is a Gtk.DrawingArea
# 'ctx' is the Cairo context
text = self.ui.entry1.get_text()
if text == '':
return
# Get the data and encode it into the image
version, size, im = qrencode.encode(text)
im = im.convert('RGBA') # Cairo expects RGB
# Create a pixel array from the PIL image
bytearr = array.array('B', im.tostring())
height, width = im.size
# Convert the PIL image to a Cairo surface
self.surface = cairo.ImageSurface.create_for_data(bytearr,
cairo.FORMAT_ARGB32,
width, height,
width * 4)
# Scale the image
imgpat = cairo.SurfacePattern(self.surface)
scaler = cairo.Matrix()
scaler.scale(1.0/self.scale_factor, 1.0/self.scale_factor)
imgpat.set_matrix(scaler)
ctx.set_source(imgpat)
# Render the image
ctx.paint()
这是将表面写入PNG文件的代码:
def on_toolbuttonSave_clicked(self, widget, data=None):
if not self.surface:
return
# The following two lines did not seem to work
# ctx = cairo.Context(self.surface)
# ctx.scale(self.scale_factor, self.scale_factor)
self.surface.write_to_png('/tmp/test.png')
所以写表面会创建一个不缩放的图像,并且在 cairo.SurfacePattern 中也没有 write 方法。
我最后的手段是获取在 gtk.DrawingArea 中呈现的缩放图像,将其放入 GtkPixbuf.Pixbuf 或新表面,然后将其写入磁盘。pixbuf 方法似乎适用于 GTK+ 2,但不适用于 GTK+ 3。
那么有谁知道我如何将缩放后的图像写入磁盘?