从GDK Pixbuf重新构建png图像

时间:2015-10-13 13:20:52

标签: python python-2.7 pickle gdkpixbuf bytesio

我想在插槽上发送图像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")

1 个答案:

答案 0 :(得分:0)

如果您想通过套接字发送Pixbuf,则必须发送所有数据,而不仅仅是像素。由于Numpy数组具有BytesIO方法,因此不需要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)