Python 3 にいくつかの RGBA データがあり、余分なライブラリを使用せずに GTK3 ウィンドウに表示する画像を表示したいと考えています。
最初に試したPixbuf
のは、例のように のデータを編集することでした (http://developer.gnome.org/gdk-pixbuf/stable/gdk-pixbuf-The-GdkPixbuf-Structure.html#put-pixel - 申し訳ありませんが、私は(C) ドキュメントではPixbuf.get_pixels()
. ただし、これにより不変bytes
オブジェクトが得られるため、明らかに機能しません。(gdk-pixbuf バグ レポート (668084、SO が許可してくれればリンクします) は同じ機能をカバーしていますが、その後少し変更されたに違いありません。)
次に、 を使用してデータから Pixbuf を作成しようとしましたPixbuf.new_from_data()
が、これもバグがあります (gdk-pixbuf バグ 674691 を参照) (はい、コメント 3 の私です)。
それから私は Cairo を見ました:ImageSurface.create_for_data
これを行う必要がありますが、何らかの理由でこれは Python 3 バインディングではまだ利用できません。(私はこれを Python 2 で試し、サーフェスを後で に変えてPixbuf
から でラップしましたがgtk.Image
、うまくいきました。しかし、私は Python3 を使用しています (それでも、面倒です - 結局のところ、カイロはベクトル グラフィックス ライブラリです)。 )。
PIL を使用して画像を PNG ファイルに書き出し、それを Pixbuf に読み込むという参照をどこかで見つけましたが、これは恐ろしいことであり、余分なライブラリを使用し、Python 3 では PIL を使用できません。
それで...他の方法はありますか?
作業コード
Havokの答えに基づいて、これが実際の例です:
from array import array
from gi.repository import Gtk as gtk, GdkPixbuf
pixels = array('H')
for i in range(20):
for j in range(20):
px = (i < 10, j >= 10, (i < 10) ^ (j < 10))
pixels.extend(65535 * c for c in px)
header = b'P6 20 20 65535 '
img_data = header + pixels
w = gtk.Window()
w.connect('delete-event', gtk.main_quit)
l = GdkPixbuf.PixbufLoader.new_with_type('pnm')
l.write(img_data)
w.add(gtk.Image.new_from_pixbuf(l.get_pixbuf()))
l.close()
w.show_all()
gtk.main()
編集:実際には、正確を期すために、ヘッダーに追加する前にリトルエンディアンシステムが必要になると思いますpixels.byteswap()
(もちろん、これらの色には関係ありません)。