Cairo image surfaceを使用する小さなPyGIプロジェクトがあります。これをsurface patternで拡大縮小し、Gtk.DrawingAreaでレンダリングします。Gtk.DrawingAreaまたはCairoパターンの内容をディスク上の画像に保存します。
スケールのバージョンをPNGファイルに書きたいと思います。私は元の表面からSurface.write_to_png()で書き込もうとしましたが、元のサイズ(つまりスケールされていない)だけを書き込むので、そこにこだわっています。
私はGtk.DrawingAreaからレンダリングされたイメージを取り出してディスクに書き込むことができたと思っていましたが、PyGIでこれを行う方法はわかりませんでした(これはGTK + 2でのみ可能です - save gtk.DrawingArea to file )。だから私は私のスケール画像をディスクに書き込む方法を理解しようとしています。
ここで表面を作成するコードがあります、それをスケールアップし、それをレンダリング:
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では動作しませんでした。
どのようにスケーリングされたイメージをディスクに書き込むことができますか?