如何用Python在Linux非标准Framebuffer(/dev/fb4)上绘图?
在Linux非标准帧缓冲(/dev/fb4)上用Python绘图的方法
方法1:直接操作帧缓冲文件(底层原生方式)
无需额外依赖,直接读写/dev/fb4设备文件,适合简单的像素级绘图。核心是匹配LCD的分辨率和色彩格式(你的设备是320x240、16位RGB565)。
import struct # 帧缓冲设备路径 FB_DEVICE = "/dev/fb4" # 屏幕参数 WIDTH = 320 HEIGHT = 240 BITS_PER_PIXEL = 16 BYTES_PER_PIXEL = BITS_PER_PIXEL // 8 # 打开帧缓冲(需root权限,或给/dev/fb4添加读写权限) with open(FB_DEVICE, "wb") as fb: # 全屏填充红色(RGB565格式下红色值为0xF800) red_pixel = struct.pack("<H", 0xF800) # 小端字节序,根据系统调整 fb.write(red_pixel * WIDTH * HEIGHT) # 绘制一个蓝色矩形(RGB565蓝色值为0x001F) blue_pixel = struct.pack("<H", 0x001F) for y in range(50, 150): fb.seek(y * WIDTH * BYTES_PER_PIXEL + 50 * BYTES_PER_PIXEL) fb.write(blue_pixel * 100)
可通过fbset -fb /dev/fb4命令查看帧缓冲的实际色彩格式、字节序等参数,确保像素值匹配。
方法2:用Pygame指定非标准帧缓冲
Pygame支持通过环境变量强制指定帧缓冲设备,无需修改核心逻辑,适合需要绘制文本、图形的场景。
import os import pygame import time # 指定目标帧缓冲 os.environ["SDL_FBDEV"] = "/dev/fb4" # 强制使用帧缓冲驱动,避免跳转到HDMI显示器 os.environ["SDL_VIDEODRIVER"] = "fbcon" # 初始化并设置屏幕尺寸 pygame.init() screen = pygame.display.set_mode((320, 240)) # 绘制内容 screen.fill((0, 255, 0)) # 绿色背景 font = pygame.font.Font(None, 36) text = font.render("Hello LCD!", True, (255, 0, 0)) screen.blit(text, (50, 100)) # 更新显示 pygame.display.flip() # 保持显示5秒 time.sleep(5) pygame.quit()
安装依赖:sudo apt install python3-pygame,若pip安装需确保适配ARM架构。
方法3:用PIL/Pillow生成图像后写入帧缓冲
先通过PIL完成文本、图形绘制,再转换为帧缓冲兼容的色彩格式写入,适合复杂绘图需求。
from PIL import Image, ImageDraw, ImageFont import struct FB_DEVICE = "/dev/fb4" WIDTH = 320 HEIGHT = 240 # 创建RGB图像画布 img = Image.new("RGB", (WIDTH, HEIGHT), (255, 255, 255)) draw = ImageDraw.Draw(img) # 绘制文本(需指定系统中存在的字体文件路径) font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 24) draw.text((40, 80), "Odroid C4 LCD", font=font, fill=(0, 0, 255)) # 绘制矩形 draw.rectangle([(100, 120), (220, 180)], fill=(255, 0, 0), outline=(0, 0, 0)) # 将RGB转换为RGB565格式 def rgb_to_rgb565(r, g, b): return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3) pixels = img.load() fb_data = b"" for y in range(HEIGHT): for x in range(WIDTH): r, g, b = pixels[x, y] rgb565 = rgb_to_rgb565(r, g, b) fb_data += struct.pack("<H", rgb565) # 写入帧缓冲 with open(FB_DEVICE, "wb") as fb: fb.write(fb_data)
安装依赖:sudo apt install python3-pil
权限处理
默认/dev/fb4仅root可读写,解决方式:
- 运行脚本时加
sudo前缀 - 临时开放权限:
sudo chmod 666 /dev/fb4(重启失效) - 添加udev规则永久开放权限(需编辑
/etc/udev/rules.d/99-fb4.rules,写入KERNEL=="fb4", MODE="0666")
内容的提问来源于stack exchange,提问作者user21979764
相关产品推荐
相关产品推荐

