You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3 CGI脚本如何返回树莓派3摄像头拍摄的JPG图片

解决树莓派CGI脚本返回摄像头图片的问题

我看了你遇到的问题:之前用CGI返回温度功能正常,但返回摄像头图片时浏览器显示破碎图标。先说说你原代码的问题所在,再给你修正后的方案。

你的原代码里,subprocess.run(['raspistill','-o','-'])没有指定捕获输出,所以raspistill会直接把图片数据打印到终端,而你print()的其实是subprocess.run返回的CompletedProcess对象的字符串表示——浏览器收到的根本不是有效的JPEG二进制数据,自然显示破碎。另外,就算你捕获了输出,用print()处理二进制数据也会出问题:print()会默认把内容当成字符串处理,可能引入编码转换错误或者额外的换行符,直接破坏图片的二进制结构。

修正后的代码

#!/usr/bin/python3
import subprocess
import sys

# 发送正确的HTTP头部,告诉浏览器这是JPEG图片
print("Content-type:image/jpeg\r\n\r\n")

# 调用raspistill,捕获二进制输出,-t 0 表示立即拍摄(避免默认5秒延迟)
result = subprocess.run(
    ['raspistill', '-o', '-', '-t', '0'],
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE
)

# 直接通过stdout的buffer写入二进制图片数据
sys.stdout.buffer.write(result.stdout)

关键说明

  • 捕获输出:必须加上stdout=subprocess.PIPE,才能把raspistill输出的图片数据存到result.stdout里,而不是直接输出到终端。
  • 二进制输出:用sys.stdout.buffer.write()代替print(),因为图片是二进制数据,sys.stdout.buffer可以直接写入原始字节,不会做任何编码转换或额外处理。
  • 添加-t 0参数:raspistill默认会有5秒的拍摄延迟,加上-t 0可以立即拍摄返回图片,避免CGI超时或者等待过久。

你可以试试这个代码,应该就能在浏览器里正常显示摄像头拍摄的图片了。

内容的提问来源于stack exchange,提问作者testcaseone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:00:25