UEFI GOP环境下十六进制图像缓冲区绘制像素异常如何解决?
问题原因&修复方案
你代码里存在以下几个可直接导致绘制失败的问题,逐一修改即可:
1. 索引变量未初始化
你声明了uint32_t pos;但没有初始化为0,pos初始值是随机垃圾值,导致从Wallpaper数组读取像素的起始位置完全错位,这是最核心的错误。
2. 循环边界错误
你直接使用屏幕宽高作为循环边界,若你的Wallpaper图像分辨率和屏幕分辨率不一致,会出现数组越界读取无效值,或者图像绘制不全的问题。
3. 通道顺序适配问题
UEFI Graphics Output Protocol默认的像素格式为BGRA顺序(内存排布依次是B、G、R、A),如果你的Wallpaper数组存储的像素顺序不是RGBA,或者转换逻辑和帧缓存要求不匹配,会出现颜色完全错乱的问题。
修改后可运行代码
首先先定义你Wallpaper图像的实际分辨率:
// 替换为你实际的图像宽高 #define IMAGE_WIDTH 1920 #define IMAGE_HEIGHT 1080
修改绘制函数:
void PlotPic() { // 初始化索引为0 uint32_t pos = 0; // 取图像和屏幕的最小宽高,避免越界 int draw_width = min(IMAGE_WIDTH, TargetFramebuffer->Width); int draw_height = min(IMAGE_HEIGHT, TargetFramebuffer->Height); for (int y = 0; y < draw_height; y++) { for (int x = 0; x < draw_width; x++) { int r = Wallpaper[pos++]; int g = Wallpaper[pos++]; int b = Wallpaper[pos++]; int a = Wallpaper[pos++]; // 不需要透明效果的话直接固定alpha为0xFF即可,避免alpha混合异常 unsigned int pixel = RGBAtoHex(r, g, b, 0xFF); PlotPixel(x, y, pixel); } // 若你的图像有行对齐填充(比如bmp格式),此处需要添加跳过填充字节的逻辑: // pos += 行对齐填充字节数; } }
补充调试方案
如果修改后颜色还是显示异常,说明你的Wallpaper数组存储的像素顺序不是RGBA,调整取值顺序即可:
// 若数组存储顺序为BGRA,替换为如下取值逻辑 int b = Wallpaper[pos++]; int g = Wallpaper[pos++]; int r = Wallpaper[pos++]; int a = Wallpaper[pos++];
内容的提问来源于stack exchange,提问作者user16028858
相关产品推荐
相关产品推荐

