2015-10-13 12 views
0

Я хочу отправить изображение Pixbuf поверх сокета, но полученное изображение только черно-белое и искажено. Вот шаги, я использую:Re-Construct a png image from GDK 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) Deserialize полученной строки в исходном пикселях массиве

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

ответ

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

Хорошая идея спасибо :) –