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

树莓派Pico如何通过framebuf显示从HTTP API获取的JPEG图片?

解决树莓派Pico加载JPEG到Waveshare电子纸framebuf的问题

方案一:服务端预处理(最推荐,节省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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:14:55