2015-10-13 105 views
0

我想通過套接字發送圖像Pixbuf,但接收到的圖像只有黑白和扭曲。 下面是我使用以下步驟:從GDK Pixbuf重新構建PNG圖像

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)從像素陣列

3構建的pixbuf)保存圖像

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") 

回答

0

如果你想發送Pixbuf通過套接字你必須發送全部數據,而不僅僅是像素。 BytesIO對象不是必需的,因爲Numpy數組有一個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) 
+0

好主意,謝謝:) –