1. 前言
客户在做 GUI 项目开发时,会碰到许多显示相关的问题。而屏幕花屏是比较严重的问题,如果产品出现花屏,会严重影响使用体验。正常的 UI 显示,包括画图和将帧缓冲传输到屏幕两个过程。如果画图过程出错,那帧缓冲的内容就不对了,传输到屏幕后显示也不对。而如果画图过程正确,而传输过程出错,虽然帧缓冲的内容是对的,而屏幕接收到的数据出错了,那屏幕显示的内容自然也是错误的。因此在定位显示错乱、花屏等问题时,需要先判断是画图出错还是传输过程出错。本文会介绍一种方法,将帧缓冲内容导出并保存为图片,来判断帧缓冲内容是否正确。
由于帧缓冲的内容为全部像素的 RGB 数据,在导出后需要借助其它工具将 RGB 数据转换为图片,方便在 PC 上直接查看。这里可以使用 python 的 pillow 包,将 RGB 转换为JPG 图片。而读取帧缓冲的过程可以借助 python 的 pyswd 包来实现。 本机环境:Windows10 64bit
安装 python 3.9.0 (测试过 3.9.6 正常),检查系统环境变量,将 python 添加到 Path中。
图1.设置环境变量
3. 将帧缓冲保存为图片
3.1. 读取帧缓冲
通过 pyswd,可以创建 stlink 对象连接到目标板,用 read_mem 函数来读取目标板内存。
3.2. 保存图片
从 Pillow 包导入 Image 类,创建图片对象,将 pyswd 读取的 framebuffer 数据填充到 image 对象中并保存实现代码如下,保存为 pyswd_rgb2jpg.py 文件。
- #!/usr/bin/env python
- # pyswd_rgb2jpg.py fb_addr width hight bpp output_name
- # pyswd_rgb2jpg.py 0x20000090 390 390 3 abc.jpg
- import swd
- from PIL import Image
- #from io import BytesIO
- import sys
- w = int(sys.argv[2]) #390
- h = int(sys.argv[3]) #390
- bpp = int(sys.argv[4])
- size = w * h * bpp #RGB565/RGB888
- fb_addr = int(sys.argv[1], 16) #hex
- dev = swd.Stlink(swd_frequency=1800000, logger=None)
- im_data = dev.read_mem(fb_addr, size)
- im_list = list(im_data)
- ## test rgb565.dta file, RGB offset = 16
- ## pyswd_rgb2jpg.py rgb565.dta 100 100 2 rgb565.jpg
- #with open(sys.argv[1], 'rb') as f:
- # f.seek(16)
- # data = f.read()
- # #print(data)
- #im_list = list(data)
- im = Image.new("RGB", (w, h))
- if bpp == 3:
- for j in range(0, h):
- for i in range(0, w):
- im.putpixel((i, j), (im_list[(w*j + i)*bpp + 2], im_list[(w*j + i)*bpp + 1], im_list[(w*j + i)*bpp]))
- elif bpp == 2:
- for j in range(0, h):
- for i in range(0, w):
- r = im_list[(w*j + i)*bpp + 1] >> 3
- g = ((im_list[(w*j + i)*bpp + 1] & 0x07) << 3) | (im_list[(w*j + i)*bpp] >> 5)
- b = im_list[(w*j + i)*bpp] & 0x1f
- r = round((r * 255) / 31.0)
- g = round((g * 255) / 63.0)
- b = round((b * 255) / 31.0)
- im.putpixel((i, j), (r, g, b))
- #print("%02x %02x %02x" %(r, g, b))
- else:
- print("bpp error")
- im.save(sys.argv[5])
复制代码
完整版请查看:附件
将framebuffer保存成图片来检查其内容是否正常_v1.0.pdf
(450.27 KB, 下载次数: 2)
|
学习学习