- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
Frame的意思是帧,buffer的意思是缓冲区。Framebuffer就是一块内存(硬件设备),里面保存着一帧图像.
ioctl()函数非常强大。不同的驱动程序内部会实现不同的 ioctl() ,可以使用各种 ioctl() 跟驱动程序交互:可以传数据给驱动程序,也可以从驱 动程序中读出数据.
头文件:
#include <sys/ioctl.h>
函数原型:
int ioctl(int fd, unsigned long request, ...);
函数说明: ① fd 表示文件描述符; ② request 表示与驱动程序交互的命令, 用 不同的命令控制驱动程序输出我们需要的数据 ; ③ … 表示可变参数 arg, 根据 request 命令,设备驱动程序返回输出的数据。 ④ 返回值: 打开成功返回0,失败将返回-1 。
1.获取framebuffer描述符 。
fd_fb = open("/dev/fb0", O_RDWR); //可读可写
if(fd_fb == -1) {
printf("can not open /dev/fb0\n");
return -1;
}
2.获取屏幕可变参数 。
if(ioctl(fd_fb, FBIOGET_VSCREENINFO, &var)) { //结构体名不是地址,需要取地址。FBIOGET_VSCREENINFO是获取可变参数(fb.h)
printf("can not get var\n");
return -1;
}
3.计算framebuffer空间大小 。
line_width = var.xres * var.bits_per_pixel / 8;
pixel_width = var.bits_per_pixel / 8;
screen_size = var.xres * var.yres * var.bits_per_pixel / 8; //单位:字节
fb_base = (unsigned char*)mmap(NULL, screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);
if(fb_base == (unsigned char*)-1) {
printf("can not mmap\n");
return -1;
}
4.不同的RGB格式转换 。
switch(var.bits_per_pixel)
{
case 8:
{
/*代码*/
break;
}
case 16:
{
/* 32位转换为RGB565 */
red = (color >> 16) & 0xff; //保留17-24位
green = (color >> 8) & 0xff; //保留8-16位
blue = (color >> 0) & 0xff; //保留0-8位
color = ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3); //组合为16bit
*add_16 = color; //像素点对应的地址空间赋值
break;
}
case 32:
{
*add_32 = color;
break;
}
default:
printf("can't surport %dbpp\n", var.bits_per_pixel);
break;
}
完整程序如下:
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/fb.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
int fd_fb; //文件描述符
int screen_size; //屏幕总字节数(framebuffer的大小)
struct fb_var_screeninfo var;
unsigned char *fb_base;
unsigned int line_width; //行字节
unsigned int pixel_width; //像素字节
void lcd_put_pixel(int x, int y, unsigned int color) {
unsigned char *add_8 = fb_base + y*line_width + x*pixel_width; //像素点对应的内存地址
unsigned short *add_16;
unsigned int *add_32;
unsigned int red, green, blue;
add_16 = (unsigned short*)add_8; //8位转换为16位
add_32 = (unsigned int*) add_8;
switch(var.bits_per_pixel)
{
case 8:
{
/*代码*/
break;
}
case 16:
{
/* 32位转换为RGB565 */
red = (color >> 16) & 0xff; //保留17-24位
green = (color >> 8) & 0xff; //保留8-16位
blue = (color >> 0) & 0xff; //保留0-8位
color = ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3); //组合为16bit
*add_16 = color; //像素点对应的地址空间赋值
break;
}
case 32:
{
*add_32 = color;
break;
}
default:
printf("can't surport %dbpp\n", var.bits_per_pixel);
break;
}
}
int main(int argc, char **argv)
{
int i;
/* 1.获取framebuffer描述符 */
fd_fb = open("/dev/fb0", O_RDWR); //可读可写
if(fd_fb == -1) {
printf("can not open /dev/fb0\n");
return -1;
}
/* 2.获取屏幕可变参数 */
if(ioctl(fd_fb, FBIOGET_VSCREENINFO, &var)) { //结构体名不是地址,需要取地址
printf("can not get var\n");
return -1;
}
/* 3.计算framebuffer空间大小 **/
line_width = var.xres * var.bits_per_pixel / 8;
pixel_width = var.bits_per_pixel / 8;
screen_size = var.xres * var.yres * var.bits_per_pixel / 8; //单位:字节
fb_base = (unsigned char*)mmap(NULL, screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);
if(fb_base == (unsigned char*)-1) {
printf("can not mmap\n");
return -1;
}
/* 清屏: 全部设为白色 */
memset(fb_base, 0xff, screen_size);
/* 随便设置出100个为蓝色 */
for (i = 0; i < 100; i++)
lcd_put_pixel(var.xres/2+i, var.yres/2, 0x0000FF);
munmap(fb_base , screen_size);
close(fd_fb);
return 0;
}
最后此篇关于嵌入式Linux—Framebuffer应用编程的文章就讲到这里了,如果你想了解更多关于嵌入式Linux—Framebuffer应用编程的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用 OpenGL 帧缓冲区对象 (FBO) 在 iOS 上实现模板阴影。代码有效——也就是说,从视觉上看,模板缓冲区正在完成这项工作,而且性能似乎还不错。 但是,当我通过 OpenGL ES
一个像样的图像开始于 VK_IMAGE_LAYOUT_UNDEFINED但会是 VK_IMAGE_LAYOUT_PRESENT_SRC_KHR在它们被呈现一次之后。 很多例子都做了一个过渡vkImag
我需要一种非常快速的方法来在屏幕上显示数据缓冲区。我首先尝试访问linux帧缓冲区,事实证明那是相当不错的。然后,我了解了directFB,并且喜欢它提供的额外功能(例如快速memcpy,即时调整图像
所以我正在制作一个可以使用directx10,11和opengl的引擎。 到目前为止,一切都运行良好。它可以在 opengl 和 directx 中正确渲染图像,并且两者看起来相同。 现在我添加了渲染
我使用 FBO 在我的 LevelScreen 渲染方法中渲染多 channel 模糊着色器。我想要实现的是制作一个 MenuScreen,它在背景上渲染 LevelScreen,在它上面应用另一个模
我有一个 RaspberryPi 并且想在没有 xserver 的情况下全屏显示图像 - 所以直接将它写入帧缓冲区。这里没问题。 但是设置为全屏是行不通的。 cat /sys/class/graphi
如何直接写入linux framebuffer? 最佳答案 查看 FBIOPUT_VSCREENINFO、ioctl 和 mmap (我有代码但不在这台电脑上,抱歉) 编辑:这应该让你开始 //o
android framebuffer 和 linux framebuffer 之间有什么区别吗? 问候, 玛雅克 最佳答案 Android 使用标准 Linux 帧缓冲区,如下所述:http://w
我使用一个程序来绘制一些 2D 纹理并使用它们。在这个程序中使用了 libgdx。我在使用 FrameBuffer 时遇到了一些问题。我尝试在我的 FrameBuffer 中绘制一些纹理,然后我需要保
我正在将后期处理效果集成到我的 3D 引擎中。我在使用带有 WebGL 的 FrameBuffer 对象捕获深度数据时遇到了障碍。将颜色数据捕获到 FrameBuffer 中没有问题。但是,即使为 C
我想从 Android 中的 FrameBuffer 中截取屏幕截图,我使用下面的代码,但只得到了一张模糊的图像。我包含 3 个主要步骤。首先,从 FrameBuffer 中读取数据和信息,其次,将原
我正在使用 LibGDX 框架开发一个绘画应用程序,我正在使用他们的 FrameBuffer 类将用户绘制的内容合并到实体纹理上,这就是他们所看到的绘图。这方面工作得很好,但是,用户可以绘制的区域并不
我正在学习在 Qt 中使用 OpenGL 和 QOpenGLFramebufferObject,并尝试使用以下代码绘制三角形: 在 render() 中: glUseProgram(m_program
我正在使用 opengl ES 2.0我正在使用链接到纹理的帧缓冲区来编译屏幕外渲染(一些简单的元球),然后将该纹理渲染到主后台缓冲区。 一切看起来都很棒,除了纹理出现剪裁,即。它不是完整的窗口尺寸(
我有一个直接渲染到帧缓冲区的 OpenGL 应用程序。 如果我从终端启动应用程序,有时我会看到光标在我的应用程序后面闪烁。同样,如果我从 X 中的终端仿真器内部启动它,当我四处移动鼠标时,我会瞥见鼠标
我对这些硬件的实际工作原理知之甚少,但现在我需要学习如何为 Android 设备编写 Linux 帧缓冲驱动程序。 我对 Linux 图形堆栈感到困惑。据我了解,在台式计算机上,合成窗口管理器与 DR
所以我正在尝试制作自定义按钮,为此我需要组合按钮背景的不同部分。为此,我认为使用 FrameBuffer 是可行的,但它没有给出可行的结果。因此,我尝试通过编写一个简单的测试方法来测试我的 Frame
由glGenTextures(...)、glGenFramebuffers(...)生成的id会是0吗?更具体地说,我可以使用零作为未初始化纹理的 id,还是需要使用 -1? 最佳答案 没有 glGe
我现在正在研究Ctrl+Alt+F1~F7背后的机制是什么。 我发现了一些关于framebuffer、VT和tty的信息。我知道帧缓冲区是图形卡操作的抽象,而 tty(和 pts)是程序与之交互的东西
我尝试实现一些后处理,所以我需要使用 FrameBuffer 收集整张图片,然后使用着色器对其进行后处理。我在 LibGDX( Rendering a 3D model to texture in L
我是一名优秀的程序员,十分优秀!