在MicroPython中为树莓派Pico W解码JPG获取RGB像素数据
在Raspberry Pi Pico W上用MicroPython解码JPG并显示到Neopixel矩阵
核心思路
利用MicroPython内置模块完成所有操作:ujpeg解码JPG、urequests下载在线图片、neopixel驱动LED矩阵,完全避开PIL/Pillow和numpy,适配Pico的存储空间限制。
1. 前置准备
确保你的Pico W刷入最新官方MicroPython固件,官方固件默认自带ujpeg、urequests和neopixel模块,无需额外安装。
2. 下载在线JPG图片
用urequests直接获取图片二进制数据,存放在内存中(避免占用Flash空间):
import urequests # 替换为你的目标图片URL,确保尺寸和LED矩阵一致 IMAGE_URL = "http://example.com/your-matrix-sized-image.jpg" response = urequests.get(IMAGE_URL) if response.status_code == 200: jpg_raw = response.content # 存储图片二进制数据 response.close() # 立即关闭连接释放资源
3. 解码JPG提取RGB像素
ujpeg.decode()会返回图片的宽、高,以及按行排列的RGB字节流(每3个字节对应一个像素的R、G、B值),我们将其转换为像素列表:
import ujpeg # 解码JPG数据 img_width, img_height, rgb_bytes = ujpeg.decode(jpg_raw) # 将字节流转换为(R, G, B)像素元组列表 pixel_list = [] for i in range(0, len(rgb_bytes), 3): r = rgb_bytes[i] g = rgb_bytes[i+1] b = rgb_bytes[i+2] pixel_list.append((r, g, b))
4. 驱动Neopixel矩阵
将像素数据写入LED矩阵,默认按从左到右、从上到下的线性顺序排列;若你的矩阵是蛇形排列,需自行调整索引映射:
from machine import Pin import neopixel # 配置矩阵参数,替换为你的实际值 MATRIX_WIDTH = 16 MATRIX_HEIGHT = 16 NEOPIXEL_PIN = 2 # 连接Neopixel的数据引脚 # 初始化Neopixel对象 np = neopixel.NeoPixel(Pin(NEOPIXEL_PIN), MATRIX_WIDTH * MATRIX_HEIGHT) # 逐个写入像素颜色 for idx, color in enumerate(pixel_list): np[idx] = color np.write() # 刷新LED显示
完整可运行代码
整合所有步骤并加入基础错误处理:
import urequests import ujpeg from machine import Pin import neopixel # 配置项 IMAGE_URL = "http://example.com/16x16-image.jpg" MATRIX_WIDTH = 16 MATRIX_HEIGHT = 16 NEOPIXEL_PIN = 2 try: # 下载图片 response = urequests.get(IMAGE_URL) if response.status_code != 200: raise Exception(f"下载失败,状态码: {response.status_code}") jpg_raw = response.content response.close() # 解码图片 img_w, img_h, rgb_bytes = ujpeg.decode(jpg_raw) if img_w != MATRIX_WIDTH or img_h != MATRIX_HEIGHT: raise Exception(f"图片尺寸不匹配: {img_w}x{img_h} vs 矩阵{MATRIX_WIDTH}x{MATRIX_HEIGHT}") # 转换像素列表 pixel_list = [] for i in range(0, len(rgb_bytes), 3): pixel_list.append((rgb_bytes[i], rgb_bytes[i+1], rgb_bytes[i+2])) # 更新LED矩阵 np = neopixel.NeoPixel(Pin(NEOPIXEL_PIN), MATRIX_WIDTH * MATRIX_HEIGHT) for idx, color in enumerate(pixel_list): np[idx] = color np.write() except Exception as e: print(f"错误: {e}")
关键注意事项
- 尺寸匹配:提前在电脑上将图片缩放到和LED矩阵完全一致的尺寸,Pico算力有限,不建议在设备上做缩放。
- 内存限制:避免使用过大的图片,16x16或32x32的JPG足够,防止内存溢出。
- 固件检查:如果固件缺少
ujpeg,重新刷入官方最新固件即可解决。
内容的提问来源于stack exchange,提问作者Appitome
相关产品推荐
相关产品推荐

