Gar*_* Z. 10 framebuffer images display fbi
目标:我正在为帧缓冲区编写一个非常简单的图像查看器/dev/fb0
(类似于fbi)。
当前状态:
/sys/class/graphics/fb0/virtual_size
我的软件从(例如)中获取像素分辨率1920,1080
。/dev/fb0
. 这在我的一台分辨率为 1920x1080 的笔记本电脑上运行得非常好。y
更准确地说:在-row x
-col =>处设置一个像素,arr[y * 1920 * 4 + x * 4 + channel]
其中值为channel
(0,1,2,3
分别为B
、G
、R
和A
)。问题:
/sys/.../virtual_size
当我在旧笔记本电脑上使用( ->分辨率)尝试相同的软件时1366,768
,图像未正确显示(有点倾斜)。所以我研究了像素宽度值,发现该值为1376(而不是 1366)。
问题:
Ste*_*itt 13
以编程方式,要检索有关帧缓冲区的信息,您应该使用和sFBIOGET_FSCREENINFO
FBIOGET_VSCREENINFO
ioctl
:
#include <fcntl.h>
#include <linux/fb.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
int main(int argc, char **argv) {
struct fb_fix_screeninfo fix;
struct fb_var_screeninfo var;
int fb = open("/dev/fb0", O_RDWR);
if (fb < 0) {
perror("Opening fb0");
exit(1);
}
if (ioctl(fb, FBIOGET_FSCREENINFO, &fix) != 0) {
perror("FSCREENINFO");
exit(1);
}
if (ioctl(fb, FBIOGET_VSCREENINFO, &var) != 0) {
perror("VSCREENINFO");
exit(1);
}
printf("Line length: %ld\n", fix.line_length);
printf("Visible resolution: %ldx%ld\n", var.xres, var.yres);
printf("Virtual resolution: %ldx%ld\n", var.xres_virtual, var.yres_virtual);
}
Run Code Online (Sandbox Code Playgroud)
line_length
为您提供行步幅。
行步幅不必与宽度相同;在你的 1920 宽屏幕上,你的软件只是“偶然”运行(并不是什么意外,通常会根据硬件对齐要求选择步幅,并且 1920 已经可以被 16 整除,这是常见的对齐要求)。
由于不熟悉良好的 ole Linux 帧缓冲区基础设施,我无法直接告诉您如何做到这一点,但您需要弄清楚步幅。
Linux 只是记录行按 16 的倍数对齐,因此您总是需要将宽度四舍五入到下一个倍数,或者 /sys/class/graphics/fb0/ 包含定义步幅的不同虚拟文件,或行对齐。