python3通过管道/ udp,PIL错误等发送图像

时间:2018-08-14 14:41:23

标签: python-3.x image udp python-imaging-library named-pipes

我在弄清楚如何通过linux上的UDP套接字或命名管道(fifo)发送和接收图像(并显示图像,而不是保存图像)时遇到了困难。

使用UDP套接字,我遇到的问题是文件大小超过了最大缓冲区大小。从概念上讲,我可以按缓冲区大小的块对图像的字节数组进行迭代,但是我不确定如何实现此方法,或者如何在另一侧重建图像。

使用命名管道,下面是我的代码。

p1.py

fifo_name = "fifoTest"

def Test():
    img = cv2.imread("Lenna.png")
    data = bytearray(img)

    try:
        os.mkfifo(fifo_name)
        print("made fifo")
    except FileExistsError:
        print("fifo exists!")

    with open(fifo_name, "wb", os.O_NONBLOCK) as f:
        f.write(data)
        f.close()
    print("done!")

p1的一些问题是,我似乎无法弄清楚何时完成对管道的写入,而且无论其他管道发生什么情况,这通常会给BrokenPipeError

p2.py

import os
import io
from PIL import Image
import cv2

pipe = os.open("fifoTest", os.O_RDONLY, os.O_NONBLOCK)
#   img is 117966bytes as given by shell command wc -c < Lenna.png
imgBytes = os.read(pipe, 117966)
#img = Image.open(io.BytesIO(imgBytes))
print(imgBytes)
print(len(imgBytes))
#cv2.imshow("img", img)

input("there?")

有了p2和注释行,我没有问题。 input捕获按键后,我没有收到任何错误,但是如前所述,关于管道破裂的p1错误。当img = Image.open(io.BytesIO(imgBytes))取消注释时,我得到

    img = Image.open(io.BytesIO(imgBytes))
  File "/usr/local/lib/python3.5/dist-packages/PIL/Image.py", line 2585, in open
    % (filename if filename else fp))
OSError: cannot identify image file <_io.BytesIO object at 0x7f21b84b0a98>

我觉得这不应该是一个难题,这是一个非常基本的操作。我需要以大约10fps的速度发生这种情况(这就是为什么我不考虑其他选项的原因)。我也几次遇到resource temporarily unavailable错误,但是我认为os.O_NONBLOCK标志解决了该问题。

我已经看过的东西(有些很有帮助,但是一旦收到图像我就需要显示它):

Sending image over sockets (ONLY) in Python, image can not be open

Send image using socket programming Python

File Send by UDP Sockets

Send image using socket programming Python

PIL: Convert Bytearray to Image

0 个答案:

没有答案