Windows で Python から GdkPixbuf を使用して、いくつかのピクセルをファイルに保存しようとしています。私は優れたPyGI AIO (3.14.0)バイナリを利用しています。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from gi.repository import Gtk, Gdk, GdkPixbuf
w, h, n = 4, 4, 4
data = bytearray(b'\x00\x00\x00\xff' * w * h)
#data = GLib.Bytes.new(b'\x00\x00\x00\xff' * w * h).get_data()
#import numpy as np
#data = np.zeros((w,h,n), np.uint8)
#data[:,:,3] = 255
#data = data.tostring()
options = {}
pixbuf = GdkPixbuf.Pixbuf.new_from_data(data, GdkPixbuf.Colorspace.RGB, True, 8, w, h, n*w, None, None)
pixbuf.savev('screenshot.bmp', 'bmp', options.keys(), options.values())
拡大した結果は次のようになります。
明らかに、最初の数ピクセルが破損しています。壊れたピクセルの量は、画像のサイズによって異なるようです。ただし、一部のピクセルはそのまま残ります。私のコードにエラーがあるか、何らかの理由でメモリが破損しているに違いありません。より大きな画像をエンコードすることは可能であり、エラーは常に最初の数ピクセルに現れます。これは文字列のエンコードの問題か何かでしょうか?
編集: OS Xでプログラムをテストしましたが、エラーは非常に似ています。したがって、GdkPixbuf への Python バインディングに関する一般的な問題であると思われ、これに関連している可能性があります。これは、スクリプトの変更されたバージョンによって生成された、より大きな PNG です。赤と緑の線のグリッドは予想される出力ですが、画像の上半分のピクセルは単なるノイズです。