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
相关产品推荐
相关产品推荐

