【问题标题】:picamera saving duplicate pictures in BytesIO streampicamera 在 BytesIO 流中保存重复的图片
【发布时间】:2017-08-31 14:25:17
【问题描述】:

所以这里的想法很简单。我想通过 BytesIO 流和 PIL 从树莓派相机中拍摄和保存图片,以便在保存之前在图像上绘制。下面的代码很简单,但是程序完成10张图片后,保存的所有图片都是一样的。

我确信有一种更简单的方法可以做到这一点,但我想使用 BytesIO 流来尝试了解更多信息。

import picamera, io
from PIL import Image

camera = picamera.PiCamera()
camera.resolution = (1920, 1080)
camera.color_effects = (128, 128)
stream = io.BytesIO()

for n in range(10):
    camera.capture(stream, "jpeg", use_video_port=True)
    stream.seek(0)
    im = Image.open(stream)
    im.save(str(n)+".jpg")
    print n
stream.close()

任何帮助将不胜感激, 尼克

【问题讨论】:

  • 捕获后将文件指针设置为偏移量0。然后加载图像,在图像数据之后设置文件指针。然后,您捕获在偏移量 0 处图像的图像数据之后写入的下一张图像。因此,您实际上只将第一张图像存储在偏移量 0 处,并将每个后续图像存储在第一张图像之后的偏移量处。
  • 看来您正在重新编码一个不是无损过程的 jpeg 图像。只需保存来自BytesIO 对象的数据即可。
  • @BlackJack 那么你建议我怎么做呢?我明白你的意思和问题是什么,但不知道如何解决它

标签: python python-imaging-library bytesio


【解决方案1】:

您的代码的问题是在每次捕获之前或读取捕获的图像之后没有寻找内存中文件对象的开头。但是无论如何,使用io.BytesIOPIL.Image 是不必要的复杂。您可以直接捕获到文件:

#!/usr/bin/env python
# coding: utf-8
from __future__ import absolute_import, division, print_function
import picamera


def main():
    with picamera.PiCamera() as camera:
        camera.resolution = (1920, 1080)
        camera.color_effects = (128, 128)

        for n in range(10):
            camera.capture('{0:04d}.jpg'.format(n), use_video_port=True)
            print(n)


if __name__ == '__main__':
    main()

在这里,我在with 语句中使用了PiCamera 对象,以确保在我们使用完相机后正确关闭/释放此资源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 2016-07-03
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    相关资源
    最近更新 更多