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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 11:42:30