使用Pico Display Pack 2从URL取图片时遇Micropython MemoryError
问题
我购买了Pico Display Pack 2,尝试显示图片。将图片下载到Pi Pico W本地后可正常显示,但从URL下载并显示图片时出现错误:MemoryError: memory allocation failed, allocating 21760 bytes。测试过能从URL获取纯文本,但获取图片时触发内存错误,以下是完整代码:
import network import urequests import time import picographics import jpegdec from pimoroni import Button wlan = network.WLAN(network.STA_IF) wlan.active(True) wlan.connect("SSID","password") time.sleep(5) print(wlan.isconnected()) display = picographics.PicoGraphics(display=picographics.DISPLAY_PICO_DISPLAY_2, rotate=0) display.set_backlight(0.8) # Create a new JPEG decoder for our PicoGraphics j = jpegdec.JPEG(display) # Open the JPEG file #j.open_file("squid.jpg") # Decode the JPEG #j.decode(0, 0, jpegdec.JPEG_SCALE_FULL) if wlan.isconnected(): res = urequests.get(url='https://squirrel365.io/tmp/squid.jpg') j.open_RAM(memoryview(res.content)) # Decode the JPEG j.decode(0, 0, jpegdec.JPEG_SCALE_FULL) # Display the result display.update()
解决思路
先下载到本地文件再解码
Pi Pico W的RAM仅264KB,urequests.get()会把整张图片的二进制数据全部加载到内存,叠加解码所需的临时空间很容易超出上限。改为先把图片写入内置闪存,再从本地文件读取解码,避免内存被一次性占满:import gc # 导入垃圾回收模块 if wlan.isconnected(): res = urequests.get(url='https://squirrel365.io/tmp/squid.jpg') # 将图片写入本地临时文件 with open("tmp_img.jpg", "wb") as f: f.write(res.content) res.close() # 立即释放请求占用的内存 gc.collect() # 强制回收闲置内存 # 从本地文件打开并解码 j.open_file("tmp_img.jpg") j.decode(0, 0, jpegdec.JPEG_SCALE_FULL) display.update()压缩图片尺寸与质量
如果目标图片分辨率超过Pico Display Pack 2的320x240屏幕,解码时会消耗更多内存。提前把图片压缩到和屏幕一致的分辨率,同时降低JPEG质量(比如70%),缩小文件体积的同时减少解码内存需求。减少内存占用的细节优化
代码中尽量避免不必要的变量留存,用完资源后立即关闭(比如res.close()),并主动触发垃圾回收gc.collect(),在解码前尽可能释放闲置内存。替换轻量HTTP库
urequests本身占用内存较高,可尝试更精简的HTTP客户端库(如tiny_requests),进一步降低内存开销,不过对新手来说,优先尝试前三种方法更易操作。
内容的提问来源于stack exchange,提问作者Rich Harvey
相关产品推荐
相关产品推荐

