0

画像 Pixbuf をソケット経由で送信したいのですが、受信した画像は白黒で歪んでいます。私が使用している手順は次のとおりです。

1) その Pixbuf のピクセル配列を取得する

2) ピクセル配列をシリアル化する

3) シリアル化された文字列を BytesIO に変換します

4) ソケットを送信する

MyShot = ScreenShot2()
frame = MyShot.GetScreenShot() #this function returns the Pixbuf
a = frame.get_pixels_array()
Sframe = pickle.dumps( a, 1)
b = BytesIO()
b.write(Sframe)
b.seek(0)

この後、次の方法でイメージを再構築する必要があります。

1) 受信した文字列を元のピクセル配列で逆シリアル化します

2) ピクセル配列から Pixbuf を構築する

3) 画像を保存する

res = gtk.gdk.pixbuf_new_from_data(pickle.loads(b.getvalue()), frame.get_colorspace(), False, frame.get_bits_per_sample(), frame.get_width(), frame.get_height(), frame.get_rowstride()) #also tried this res = gtk.gdk.pixbuf_new_from_array(pickle.loads(b.read()),gtk.gdk.COLORSPACE_RGB,8)
res.save("result.png","png")
4

1 に答える 1

0

Pixbufソケットを介して送信する場合は、ピクセルだけでなく、すべてのデータを送信する必要があります。BytesIONumpy 配列にはtostring()メソッドがあるため、オブジェクトは必要ありません。

生データを送信する代わりにPNGを送信し、受信側でPNG画像にエンコードする方が簡単で理にかなっています。ここでBytesIOは、一時ファイルを回避するために実際にオブジェクトが必要です。送信側:

screen = ScreenShot()
image = screen.get_screenshot()
png_file = BytesIO()
image.save_to_callback(png_file.write)
data = png_file.getvalue()

次にdata、ソケットを介して送信し、受信側で単純に保存します。

with open('result.png', 'wb') as png_file:
    png_file.write(data)
于 2015-10-13T15:23:31.790 に答える