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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:05:31