Как быстрее отправлять большие сообщения в python сокете? - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь создать какой-то общий экран с сокетом python. Проблема в том, что изображения на моем экране очень большие (3 110 482 байта), и сокету требуется много времени для их отправки на сервер. Чтобы сделать отправку более эффективной, я снизил разрешение отправляемых изображений, но этого недостаточно. Поэтому мне нужно сделать процесс отправки более эффективным.

Вот функция, которая снимает изображения моего экрана:

import numpy as np # for array manipulation
import pyautogui   # for recording images of the screen
import cv2         # for change the resolution of the images
from screeninfo import get_monitors # for getting the screen size

def get_screen_img(): # take an image of the screen and return it
    img = pyautogui.screenshot() # take a screenshot

    img = np.array(img) # convert to numpy array

    monitor = get_monitors()[0] # get info on the screen monitor
    # lowered the resolution by half
    img = cv2.resize(img, dsize=(monitor.width//2, monitor.height//2), interpolation=cv2.INTER_CUBIC)

    # do some manipulation for seeing the image right
    img = np.fliplr(img) # flip the image array
    img = np.rot90(img)  # rotate the image array in 90 degrees

    return img # return the image

Вот функция, которая отправляет изображения:

import socket # for sending data
import pickle # for converting any kind of data to bytes

    def send_image(): # send a message
        # send the image and the type because I am sending more than just images so I need to tell the server what kind of info it gets
        msg = {"type": "image", "content": get_screen_img()}            

        msg = pickle.dumps(msg) # convert the message to bytes

    cSocket.send(msg) # send the msg

Редактировать: Я на 99% уверен, что проблема в размере сообщения. Когда я уменьшил разрешение, оно работает нормально, но мне нужно отправлять изображения в нормальном разрешении.

1 Ответ

0 голосов
/ 29 марта 2020

Так что я нахожу решение. Я сжимаю изображение с numpy и io следующим образом:

img = get_screen_img()
compressed_img = io.BytesIO()
np.savez_compressed(compressed_img, img)

И распаковываю вот так:

compressed_img.seek(0)
decompressed_img = np.load(compressed_img])['arr_0']

Так что если у вас есть проблемы с эффективностью отправки больших сообщений с разъем. Я думаю, что лучшим решением является сжатие сообщения. Вы также можете сжать с помощью zlib или другой библиотеки.

Также в моем случае работа будет быстрее, если вы не отправляете новый кадр, если он совпадает с предыдущим кадром, который я отправляю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...