我正试图从BytesIO将多个图片保存在一个Bytes对象中。稍后再次将这些图片从字节访问到图片。但我对字节肯定不太了解。有没有一种方法可以将一张图片之后的内容放入缓冲区,以便稍后知道图片的结束位置?客户端:
#cv2 Capture Frame
ret, frame = cls.__cap.read()
buf = BytesIO()
for i in range(10):
Image.fromarray(frame).save(buf, format='JPEG')
# Here the Logic for differentiating Pictures
body = buf.getvalue()
requests.post(url,data=body,headers={'content-type': 'application/x-image'})
网站侧:
images_as_bytes = BytesIO(flask.request.data)
for i in range(10):
# Here the Logic for differentiating Pictures
img = Image.open(images_as_bytes)
frame = np.asarray(img)
# process
我不确定您所做操作的基本原理或有效性,但您可以利用所有JPEG都以EOI
标记结束的事实,即:
0xff 0xd9
他们从SOI
标记开始,它是:
0xff 0xd8
同样,PNG图像以开头
0x89 0x50 0x4e 0x47 0x0d 0x0a 0x1a 0x0a
并以结尾
0x49 0x45 0x4e 0x44 0xae 0x42 0x60 0x82
这里有一些完全未经测试的、有些相关的代码,让您了解如何分割2个连接的PNG图像:
#!/usr/bin/env python3
import mmap
import re
pattern = re.compile(rb'(x89PNGx0dx0ax1ax0a.*?x00x00x00x00IENDxAEx42x60x82)', re.MULTILINE|re.DOTALL)
# I guess we could do 2 TIFFs just as easily, or JPEGs
with open('TwoConcatenatedPNGs.png', 'rb') as f:
with mmap.mmap(f.fileno(), 0,
access=mmap.ACCESS_READ) as m:
i = pattern.finditer(m)
for p in i:
print(p.span())
创建这样的测试文件:
cat IMAGE1.PNG IMAGE2.PNG > TwoConcatenatedPNGs.png
了解Python正则表达式和mmap的最佳链接。