树莓派Pico如何通过framebuf显示从HTTP API获取的JPEG图片?
方案一:服务端预处理(最推荐,节省Pico资源)
Pico的MicroPython环境算力有限,直接在提供图片的树莓派API端完成图片格式转换,输出和电子纸framebuf匹配的字节流,Pico端无需解码即可直接使用:
树莓派API端处理代码(示例用Flask实现)
from flask import Flask, make_response from PIL import Image import io app = Flask(__name__) @app.route('/api/latestImageFramebuf') def get_framebuf_image(): # 读取原始JPG图片 with Image.open("latest.jpg") as img: # 缩放到电子纸对应分辨率(以7.5寸B屏的800x480为例,按需调整) img = img.resize((800, 480)) # 转为黑白单色位图 img = img.convert("1") # 生成和framebuf MONO_HLSB格式匹配的字节流 buf = img.tobytes() response = make_response(buf) response.headers['Content-Type'] = 'application/octet-stream' return response if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
Pico端调用代码
import network import urequests from epd7in5b import EPD # 导入Waveshare的驱动类 # 连接WiFi wifi = network.WLAN(network.STA_IF) wifi.active(True) wifi.connect('<<SSID>>', '<<Password>>') # 初始化电子纸 epd = EPD() epd.init() # 获取预处理后的framebuf格式字节流 response = urequests.get("http://myRaspi/api/latestImageFramebuf") # 直接替换电子纸的framebuf缓冲区(确保分辨率完全匹配) epd.imageblack.buffer = response.content # 刷新显示并进入休眠 epd.display(epd.imageblack, epd.imagered) epd.sleep()
方案二:Pico端用MicroPython JPEG解码库
如果必须在Pico本地解码JPEG,可使用ujpeg模块(部分MicroPython固件默认包含,需自行确认或重新编译固件添加):
import network import urequests import ujpeg from epd7in5b import EPD # 连接WiFi wifi = network.WLAN(network.STA_IF) wifi.active(True) wifi.connect('<<SSID>>', '<<Password>>') # 初始化电子纸 epd = EPD() epd.init() # 获取JPG字节流并解码为RGB565格式 response = urequests.get("http://myRaspi/api/latestImage") width, height, pixel_data = ujpeg.decode(response.content, format='rgb565') # 将RGB565转为黑白像素并写入framebuf for y in range(height): for x in range(width): # 从RGB565数据中提取像素值,转灰度后做黑白阈值判断 pixel = pixel_data[y*width*2 + x*2] | (pixel_data[y*width*2 + x*2 + 1] << 8) r = (pixel >> 11) & 0x1F g = (pixel >> 5) & 0x3F b = pixel & 0x1F gray = (r*30 + g*59 + b*11) // 100 # 写入framebuf(0为黑,1为白,按需调整) epd.imageblack.pixel(x, y, 0 if gray < 128 else 1) # 刷新显示 epd.display(epd.imageblack, epd.imagered) epd.sleep()
注意:该方案在Pico上运行速度较慢,大分辨率图片可能出现卡顿或内存不足的情况。
方案三:修复原代码逻辑(仅作参考,不推荐)
你之前的代码除了依赖Pillow的问题,还存在循环逻辑错误:for x in width应改为for x in range(width),height同理。但由于MicroPython不支持Pillow,该方案无法在Pico上运行,仅作逻辑修正参考。
内容的提问来源于stack exchange,提问作者mu88
相关产品推荐
相关产品推荐

