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にも書き込みメソッドはありません。
私の最後の手段は、gtk.DrawingAreaでレンダリングされたスケーリングされた画像をフェッチし、それをGtkPixbuf.Pixbufまたは新しいサーフェスに配置して、それをディスクに書き込むことです。pixbufアプローチはGTK+2で機能するように見えましたが、GTK+3では機能しませんでした。
では、スケーリングされた画像をディスクに書き込む方法を知っている人はいますか?