ZeroMQ pyzmq отправляет изображение в формате jpeg через TCP

Я пытаюсь отправить файл изображения jpeg через соединение ZeroMQ с pyzmq, но результат в 3 раза превышает размер ввода и больше не является допустимым jpeg. Я загружаю изображение и отправляю с...

f = open("test1.jpg",'rb')
strng = f.read()
socket.send(strng)
f.close()

Я получаю и сохраняю с...

message = socket.recv()
f = open("test2.jpg", 'w')
f.write(str(message))
f.close()

Я новичок в zmq, и мне не удалось найти информацию об отправке изображений. Кто-нибудь отправлял изображения через ZeroMQ или есть какие-либо идеи о том, как найти проблему?


person user3325088    schedule 16.07.2014    source источник


Ответы (3)


Перед отправкой файла вы можете закодировать его в «base64» и декодировать при получении.

Отправка:

import base64
f = open("test1.jpg",'rb')
bytes = bytearray(f.read())
strng = base64.b64encode(bytes)
socket.send(strng)
f.close()

Получение:

import base64
message = socket.recv()
f = open("test2.jpg", 'wb')
ba = bytearray(base64.b64decode(message))
f.write(ba)
f.close()
person jschiavon    schedule 17.07.2014
comment
вы можете напрямую конвертировать bytearray в байты. base64 немного медленнее. - person York Yang; 14.12.2018
comment
ничего себе, вы можете просто отправить большой файл в 1 сообщении? Можете ли вы объяснить, что операционная система сделала неправильно, что вы исправили? - person bakalolo; 02.08.2019

Вы можете попробовать imagezmq. Он специально создан для передачи изображений с помощью обмена сообщениями PyZMQ.

Отправитель

import socket
import imagezmq

sender = imagezmq.ImageSender(connect_to='tcp://receiver_name:5555')

sender_name = socket.gethostname() # send your hostname with each image

image = open("test1.jpg",'rb')
sender.send_image(sender_name, image)

Получатель

import imagezmq

image_hub = imagezmq.ImageHub()

sender_name, image = image_hub.recv_image()
image_hub.send_reply(b'OK')
person rajput    schedule 04.02.2020

Операции с нулевым копированием строк в C-строках

(от введите здесь описание ссылки)

Байты и строки. Примечание. Если вы используете Python >= 2.6, для подготовки кода PyZMQ для Python3 следует использовать синтаксис b'message', чтобы гарантировать, что все ваши строковые литеральные сообщения по-прежнему будут байт после обновления.

Самая громоздкая часть совместимости PyZMQ с точки зрения пользователя заключается в том, что, поскольку ØMQ использует C-строки и хотел бы сделать это без копирования, мы должны использовать объект байтов Py3k.

person user3666197    schedule 18.07.2014