有个pil_img数据,目前我使用pil_img.save('img.jpg')保存图片,然后在使用img =open('img.jpg','rb')方式读取,有什么办法可以不用保存img.jpg这个中间变量吗

发布时间 2023-08-15 09:02:30作者: 海_纳百川
from PIL import Image
import io

# 假设pillow_img是Pillow图像对象
# 这里使用一个示例对象,实际应根据你的数据进行替换
pillow_img = Image.open('input_image.jpg')

# 将Pillow图像数据保存到内存中
image_stream = io.BytesIO()
pillow_img.save(image_stream, format='JPEG')
image_stream.seek(0)

# 从内存中读取图像数据,此时的img_data就相当于是使用open('input_image.jpg', 'rb')读取后的数据
img_data = image_stream.read()

# 现在可以直接使用img_data,它包含了图像数据的字节流
# 例如,可以将img_data传递给open函数进行读取,或者进行其他处理
with open('output_image.jpg', 'wb') as f:
    f.write(img_data)

 在这个示例代码中,image_stream 是一个BytesIO对象,用于在内存中保存图像数据。通过将Pillow图像数据保存到image_stream 中,你可以在不生成中间文件的情况下直接从内存中读取图像数据,并将其写入到文件中。这样,你就不需要保存中间文件 img.jpg 了。

image_stream.seek(0) 是用于将字节流的读取/写入指针定位到字节流的开头位置(偏移量为0的位置)。在上面的示例中,我们使用image_stream对象保存了图像数据的字节流。

当我们使用image_stream.save()将图像数据保存到image_stream中时,写入指针会移动到数据的末尾。如果我们想从头开始读取这个字节流,就需要将读取/写入指针重新设置到开头,这就是seek(0)的作用。

所以,image_stream.seek(0) 表示将image_stream的读取/写入指针移动到字节流的开头,以便我们可以从头开始读取字节流的内容。这在我们想要从内存中读取已保存的图像数据时非常有用,例如将字节流写入文件或将其传递给其他函数进行处理。