Linux framebuffer显示bmp图片

嵌入式linux操作framebuffer显示bmp图片 编译后拷贝进开发板即可使用 使用方法 ./fb_show_bmp test.bmp 显示的图片由参数指定,上面指令中test.bmp为测试用的bmp格式的图片 效果 源码说明 代码说明 有部分代码需要注意一下 显示屏设备节点 默认使用的是/dev/fb0这个节点,如果开发板的不是这个,需要改动 显示屏显示一行像素的数据长度 显示屏一行的数据长度由 struce fb_fix_scre... 阅读详情

  帧缓冲(framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。

  framebuffer是LCD对应的一种HAL(硬件抽象层),提供抽象的,统一的接口操作,用户不必关心硬件层是怎么实施的。这些都是由Framebuffer设备驱动来完成的。

  帧缓冲设备对应的设备文件为/dev/fb*,如果系统有多个显示卡,Linux下还可支持多个帧缓冲设备,最多可达32个,分别为/dev/fb0到/dev/fb31,而/dev/fb则为当前缺省的帧缓冲设备,通常指向/dev/fb0,在嵌入式系统中支持一个显示设备就够了。帧缓冲设备为标准字符设备,主设备号为29,次设备号则从0到31,分别对应/dev/fb0-/dev/fb31。

  通过/dev/fb,应用程序的操作主要有这几种:

  • 读/写(read/write)/dev/fb:相当于读/写屏幕缓冲区。
  • 映射(map)操作:由于Linux工作在保护模式,每个应用程序都有自己的虚拟地址空间,在应用程序中是不能直接访问物理缓冲区地址的。而帧缓冲设备可以通过mmap()映射操作将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址上,然后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。
  • I/O控制:对于帧缓冲设备,对设备文件的ioctl操作可读取/设置显示设备及屏幕的参数,如分辨率,屏幕大小等相关参数。ioctl的操作是由底层的驱动程序来完成的。

  在应用程序中,操作/dev/fb的一般步骤如下:
1. 打开/dev/fb设备文件。
2. 用ioctl操作取得当前显示屏幕的参数,根据屏幕参数可计算屏幕缓冲区的大小。
3. 将屏幕缓冲区映射到用户空间。
4. 映射后即可直接读写屏幕缓冲区,进行绘图和图片显示。

  framebuffer相关数据结构介绍

  • fb_info结构体:帧缓冲设备中最重要的数据结构体,包括了帧缓冲设备属性和操作的完整性属性。定义显卡的当前状态;fb_info结构仅在内核中可见,在这个结构中有一个fb_ops指针。
  • fb_ops结构体:fb_info结构体的成员变量,fb_ops为指向底层操作的函数的指针。
  • fb_var_screen和fb_fix_screen结构体:fb_var_screen记录用户可以修改的显示控制器参数,之所以可以修改,是因为对同样的图形硬件,可以工作在不同的模式下。简单来讲,一个支持1024x768x24图形模式的硬件通常也能工作在800x600x16的图形模式下。可变的信息就是指Framebuffer的长度、宽度以及颜色深度等信息。
  • fb_fix_screen记录用户不能修改的显示控制器参数。比如图形硬件上实际的帧缓存空间的大小、能否硬件加速等信息。

  应用程序中通常要用到struct fb_var_screeninfo的下面这几个字段:
  xres、yres、bits_per_pixel,分别表示x轴的分辨率、y轴的分辨率以及每像素的颜色深度(颜色深度的单位为bit/pixel),其类型定义都是无符号32位整型数。

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <errno.h>

//14byte文件头
typedef struct
{
    char    cfType[2];//文件类型,"BM"(0x4D42)
    int     cfSize;//文件大小(字节)
    int cfReserved;//保留,值为0
    int     cfoffBits;//数据区相对于文件头的偏移量(字节)
}__attribute__((packed)) BITMAPFILEHEADER;
//__attribute__((packed))的作用是告诉编译器取消结构在编译过程中的优化对齐

//40byte信息头
typedef struct
{
    char ciSize[4];//BITMAPFILEHEADER所占的字节数
    int  ciWidth;//宽度
    int  ciHeight;//高度
    char ciPlanes[2];//目标设备的位平面数,值为1
    int  ciBitCount;//每个像素的位数
    char ciCompress[4];//压缩说明
    char ciSizeImage[4];//用字节表示的图像大小,该数据必须是4的倍数
    char ciXPelsPerMeter[4];//目标设备的水平像素数/米
    char ciYPelsPerMeter[4];//目标设备的垂直像素数/米
    char ciClrUsed[4]; //位图使用调色板的颜色数
    char ciClrImportant[4]; //指定重要的颜色数,当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要
}__attribute__((packed)) BITMAPINFOHEADER;

typedef struct
{
    unsigned char blue;
    unsigned char green;
    unsigned char red;
    unsigned char reserved;
}__attribute__((packed)) PIXEL;//颜色模式RGB

BITMAPFILEHEADER FileHead;
BITMAPINFOHEADER InfoHead;

static char *fbp = 0;
static int xres = 0;
static int yres = 0;
static int bits_per_pixel = 0;
int width, height;

int show_bmp();
int fbfd = 0;

static void fb_update(struct fb_var_screeninfo *vi)   //将要渲染的图形缓冲区的内容绘制到设备显示屏来
{  
    vi->yoffset = 1;  
    ioctl(fbfd, FBIOPUT_VSCREENINFO, vi);  
    vi->yoffset = 0;  
    ioctl(fbfd, FBIOPUT_VSCREENINFO, vi);  
}  

static int cursor_bitmap_format_convert(char *dst,char *src)
{
    int i ,j ;
    char *psrc = src ;
    char *pdst = dst;
    char *p = psrc;

    /* 由于bmp存储是从后面往前面,所以需要倒序进行转换 */
    pdst += (width * height * 3);
    for(i=0;i<height;i++){
        p = psrc + (i+1) * width * 3;
        for(j=0;j<width;j++){
            pdst -= 3;
            p -= 3;
            pdst[0] = p[0];
            pdst[1] = p[1];
            pdst[2] = p[2];
        }
    }
    return 0;
}

int show_bmp(char *path)
{
    int i;
    FILE *fp;
    int rc;
    int line_x, line_y;
    long int location = 0, BytesPerLine = 0;
    char *bmp_buf = NULL;
    char *bmp_buf_dst = NULL;
    char * buf = NULL;
    int flen = 0;
    int ret = -1;
    int total_length = 0;

    printf("into show_bmp function\n");
    if(path == NULL)
    {
        printf("path Error,return\n");
        return -1;
    }
    printf("path = %s\n", path);
    fp = fopen( path, "rb" );
    if(fp == NULL){
        printf("load cursor file open failed\n");
        return -1;
    }

    /* 求解文件长度 */
    fseek(fp,0,SEEK_SET);
    fseek(fp,0,SEEK_END);

    flen = ftell(fp);
    printf("flen is %d\n",flen);

    bmp_buf = (char*)calloc(1,flen - 54);
    if(bmp_buf == NULL){
        printf("load > malloc bmp out of memory!\n");
        return -1;
    }

    /* 再移位到文件头部 */
    fseek(fp,0,SEEK_SET);

    rc = fread(&FileHead, sizeof(BITMAPFILEHEADER),1, fp);
    if ( rc != 1)
    {
        printf("read header error!\n");
        fclose( fp );
        return( -2 );
    }

    //检测是否是bmp图像
    if (memcmp(FileHead.cfType, "BM", 2) != 0)
    {
        printf("it's not a BMP file\n");
        fclose( fp );
        return( -3 );
    }
    rc = fread( (char *)&InfoHead, sizeof(BITMAPINFOHEADER),1, fp );
    if ( rc != 1)
    {
        printf("read infoheader error!\n");
        fclose( fp );
        return( -4 );
    }
    width = InfoHead.ciWidth;
    height = InfoHead.ciHeight;

    printf("FileHead.cfSize =%d byte\n",FileHead.cfSize);
    printf("flen = %d\n", flen);
    printf("width = %d, height = %d\n", width, height);

    total_length = width * height *3;

    printf("total_length = %d\n", total_length);

    //跳转的数据区
    fseek(fp, FileHead.cfoffBits, SEEK_SET);
    printf(" FileHead.cfoffBits = %d\n",  FileHead.cfoffBits);
    printf(" InfoHead.ciBitCount = %d\n",  InfoHead.ciBitCount);    

    //每行字节数
    buf = bmp_buf;
    while ((ret = fread(buf,1,total_length,fp)) >= 0) {
        if (ret == 0) {
            usleep(100);
            continue;
        }
        printf("ret = %d\n", ret);
        buf = ((char*) buf) + ret;
        total_length = total_length - ret;
        if(total_length == 0)
            break;
    }

    ///重新计算,很重要!!
    total_length = width * height *3;
    bmp_buf_dst = (char*)calloc(1,total_length );
    if(bmp_buf_dst == NULL){
        printf("load > malloc bmp out of memory!\n");
        return -1;
    }

    cursor_bitmap_format_convert(bmp_buf_dst, bmp_buf);
    memcpy(fbp,bmp_buf_dst,total_length);

    free(bmp_buf);
    free(bmp_buf_dst);

    fclose(fp);
    printf("show logo return 0\n");
    return 0;
}

int show_picture(int fd, char *path)
{
    struct fb_var_screeninfo vinfo;
    struct fb_fix_screeninfo finfo;
    long int screensize = 0;
    struct fb_bitfield red;
    struct fb_bitfield green;
    struct fb_bitfield blue;

    //打开显示设备
    fbfd = fd;          //open("/dev/graphics/fb0", O_RDWR);
    printf("fbfd = %d\n", fbfd);
    if (fbfd == -1)
    {
        //printf("Error opening frame buffer errno=%d (%s)\n",errno, strerror(errno));
        return -1;
    }

    if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo))
    {
        //printf("Error:reading fixed information.\n");
        return -1;
    }

    if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo))
    {
        //printf("Error: reading variable information.\n");
        return -1;
    }

    //printf("R:%x ;G:%d ;B:%d \n", (int)vinfo.red, vinfo.green, vinfo.blue );
    //printf("%dx%d, %dbpp\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel );

    xres = vinfo.xres;
    yres = vinfo.yres;
    bits_per_pixel = vinfo.bits_per_pixel;

    //计算屏幕的总大小(字节)
    screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
    printf("screensize=%ld byte\n",screensize);

    //对象映射
    fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0);
    if (fbp == (char *)-1)
    {
        printf("Error: failed to map framebuffer device to memory.\n");
        return -1;
    }

    printf("sizeof file header=%ld\n", sizeof(BITMAPFILEHEADER));

    //显示图像
    show_bmp(path);

    ///在屏幕上显示多久
    sleep(100);

    fb_update(&vinfo);

    //删除对象映射
    munmap(fbp, screensize);

    return 0;
}

int main()
{
    int fbfd = 0;

    fbfd = open("/dev/fb0", O_RDWR);  
    if (!fbfd)  
    {  
        printf("Error: cannot open framebuffer device.\n");  
        exit(1);  
    } 
    show_picture(fbfd, "./girl.bmp");

    close(fbfd);
}

  这里我们是使用qemu模拟的,否则用主机会打乱工作环境! 首先按照我以前博文:
linux内核调试环境搭建搭建起来一个最小linux环境。

  注意到在编译内核的时候要加入一个内核配置选项,不然内核不支持 qemu 显卡设备,也就无法创建/dev/fb0 设备文件。

CONFIG_DRM_CIRRUS_QEMU=y
config DRM_CIRRUS_QEMU
    tristate "Cirrus driver for QEMU emulated device"
    depends on DRM && PCI
    select FB_SYS_FILLRECT
    select FB_SYS_COPYAREA
    select FB_SYS_IMAGEBLIT
    select DRM_KMS_HELPER
    select DRM_KMS_FB_HELPER
    select DRM_TTM
    help
     This is a KMS driver for emulated cirrus device in qemu.
     It is *NOT* intended for real cirrus devices. This requires
     the modesetting userspace X.org driver.

配置位置:

    Device Drivers  --->
        Graphics support  --->
            Direct Rendering Manager  --->
                Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)  --->
                <*> Cirrus driver for QEMU emulated device

qemu启动命令行参数如下:

qemu -m 512 -kernel bzImage -append "root=/dev/sda rw" -boot c -hda busybox.img -k en-us -vga cirrus -net nic -net tap,ifname=tap0,script=no

  启动qemu之后,打开上面代码编译的应用程序可见bmp文件被完整的显示出来:
这里写图片描述

  上面代码中调用函数 cursor_bitmap_format_convert 是由于bmp图象是从下至上存储的,所以我们不能进行直接顺序读取。详细的说,bmp图象存储区数据是从1078偏移字节开始。文件内第一个图象点实际上是对应图象(320*200)第200行的最左边的第一个点,而从1078开始的320个点则是图象最下面一行对应的点,之后的321个点是图象倒数第二行最左边的第一个点。这样,bmp文件最后一个字节对应的点是第一行最后边的点了。

关于bmp文件格式这里就不分析了,相对于jpeg等压缩格式,这个格式十分简单网上很多资料

注意:上面的程序只在framebuffer上显示图片,却没有删除刷新屏幕,可以使用下面的命令恢复屏幕

保存屏幕信息:dd if=/dev/fb0 of=fbfile 或: cp /dev/fb0 fbfile
恢复屏幕信息:dd if=fbfile of=/dev/fb0 或: cat fbfile > /dev/fb0

bmp 位图文件:

drop上的文件,似乎这几天ss很难用,过几天再放上原图
就是一个PC bitmap, Windows 3.x format, 1024 x 768 x 24 位图文件。

运行后选择GDB/LLDB出现这样的窗口:launch: program ‘输入程序名称,例如 D:\Desktop\新建文件夹\a.exe‘ does not exist...如何解决? 🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。 阅读详情

相关推荐

用R搞定生态溯源:MixSIAR贝叶斯混合模型从安装到出图的保姆级教程

本文提供了一份详细的MixSIAR贝叶斯混合模型教程,涵盖从R环境配置、数据预处理到模型参数设置和可视化分析的完整流程。通过实战案例和常见问题解决方案,帮助生态学研究者快速掌握混合模型在生态溯源中的应用,提升数据分析效率。

weixin_42531516的博客 467

嵌入式linux 设置framebuffer设备的屏幕参数,ARM9嵌入式Linux开发-FrameBuff和LCD驱动移植...

FrameBuffFrameBuffer介绍FrameBuffer直译就是,帧缓冲。Frame(帧):所看到的屏幕上的图像,或者在一个窗口中的图像,就叫一帧。Buffer(缓冲):一段RAM,用来暂存图像数据,这些数据会被直接写入到显示设备。帧缓冲就相当于图形操作和图像输出中间的一个介质,将程序对图形数据的处理操作反馈到显示输出上。 LCDC是将系统需要显示的数据经过处理后输出到LCD显示驱动器的...

weixin_39970668的博客 1051

《揭秘 BME688人工智能压力湿度温度气体传感器:气体检测的多面能手》:此文为AI自动生成

BME688 是博世推出的一款具有人工智能和集成高线性度高精度压力、湿度、温度传感器的气体传感器,专为移动和联网应用开发,尺寸紧凑且低功耗。BME688 作为一款先进的传感器,在多个领域展现出卓越的性能。它采用了坚固而紧凑的 3.0 x 3.0 x 0.9 mm³ 封装,这种小巧的尺寸使其能够轻松应用于对空间要求严格的移动设备和联网应用中。同时,低功耗的特性也使得它在能源有限的环境下能够长时间稳定运行。

zheng_ruiguo的专栏 1935

Linux下的帧缓冲lcd应用编程

一、Linux的帧缓冲设备 帧缓冲(framebuffer)是 Linux 为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer 设备驱动来完成的。帧缓冲驱动的应用广泛,在 linux 的桌面系统中,Xwindow

crazy_sparrow的专栏 1560

Cloudflare 5秒盾逆向实战:13次请求背后的Python补环境框架搭建指南

本文深入解析了如何通过Python构建浏览器环境模拟框架,以应对Cloudflare 5秒盾等现代Web防护机制。文章详细拆解了其背后复杂的13次请求链,涵盖了JavaScript执行引擎集成、DOM事件模拟、网络请求控制及Canvas指纹等环境检测的完整实现方案,为自动化数据采集和逆向工程提供了实战指南。

gold的博客 356

Jetson Orin NX深度学习环境配置全攻略:从JetPack到PyTorch避坑指南

本文提供Jetson Orin NX深度学习环境配置的完整避坑指南。重点讲解如何正确利用JetPack SDK作为系统基石,使用Miniforge管理Python环境,并安装与CUDA版本严格匹配的PyTorch特供版本。通过详细的步骤和验证方法,帮助开发者在ARM架构的嵌入式平台上高效搭建稳定的AI开发工作站。

yolo5detector的博客 272

framebuffer显示JPEG或BMP图片:在Linux下的图像显示新选择

framebuffer显示JPEG或BMP图片:在Linux下的图像显示新选择 去发现同类优质开源项目:https://gitcode.com/ 在开源技术领域,图像显示的需求无处不在,framebuffer显示JPEG或BMP图片的项目,为开发者提供了一种高效、简便的实现方式。下面,让我们深入探索这个项目,了解其核心功能、技术架构及应用场景。 项目介绍 framebuffer显示JPEG或BMP...

gitblog_06704的博客 879

【网络教程】Ubuntu有线连接消失,无法联网怎么办!(亲测有效!)

文章目录问题描述解决方案 问题描述 今天打开Ubuntu,突然发现无法连接网络,并且打开设置,发现设置里面的网络已经没有了有线连接,只有VPN设置选项,如图 解决方案 按照下列的代码执行即可! # 关闭网路 service NetworkManager stop # 删除NetworkManager缓存文件 sudo rm /var/lib/NetworkManager/NetworkManager.state # 打开网络 service NetworkManager start 运行完

XiaoqiangClub的博客 1万+

嵌入式Linux下framebuffer显示BMP图片源码包

嵌入式Linux下framebuffer显示BMP图片源码包 去发现同类优质开源项目:https://gitcode.com/ 简介 本仓库提供了在嵌入式Linux环境下使用framebuffer显示BMP图片的源码,以及用于测试的BMP图片。该源码适用于需要对嵌入式设备的显示界面进行自定义开发的应用场景。 内容 fb_show_bmp.zip:包含用于在framebuffer上显示BMP图片的...

gitblog_06739的博客 262

MIKE 21 教程 2.2 Domain, Time, Module Selection设置教学

上一节讲解了水动力模型的基本概念与文件创建MIKE 21 教程 2.1水动力模型介绍​本节讲解水动力模型前三个模块的设置此模块需导入之前绘制好的网格文件,导入后可预览网格文件点击上方的Domain Specification可查看网格的数据统计与高程属性,快速检查网格文件有无明显错误 点击上方的Boundary names,可查看之前定义的出入水边界。在网格文件中,我们对边界只能以数字属性进行区分,这里可以对数字属性进行命名,在name中直接修改即可。本实例中我们的2代表入水边界,3代表出水边界。因为博主日

Hello Word 3868

[网络安全自学篇] 七十三.WannaCry勒索病毒复现及分析(四)蠕虫传播机制全网源码详细解读

这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步。前文分享了逆向分析OllyDbg动态调试工具的基本用法,包括界面介绍、常用快捷键和TraceMe案例分析。这篇文章将继续详细讲解WannaCry蠕虫的传播机制,带领大家详细阅读源代码,分享WannaCry勒索病毒是如何传播感染的。作者分析该病毒一个月,一方面觉得自己技术菜,另一方面深知系统安全需要坚持,继续加油。希望文章对您有所帮助~

杨秀璋的专栏 1万+

Linux framebuffer显示bmp图片【转】

本文转载自:http://blog.csdn.net/luxiaoxun/article/details/7622988 framebuffer简介 帧缓冲(framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。framebuffer是LCD对应的一中HAL(硬件抽象层),提供抽象的,统...

297

5、数字图像采集:X射线成像技术全解析

本文全面解析了数字图像采集中的X射线成像技术,涵盖数字X射线探测器、荧光透视与血管造影、乳腺摄影以及计算机断层扫描(CT)的图像重建原理。详细介绍了TFT平板探测器的优势、DSA技术在血管成像中的应用、乳腺摄影对高对比度和分辨率的需求,以及CT中基于Radon变换和滤波反投影的重建方法。同时探讨了噪声、部分容积效应、金属伪影和运动伪影等常见问题及其影响。最后总结了各类X射线成像技术的特点与应用场景,并展望了未来在图像质量提升和剂量优化方面的技术发展方向。

l6m7n8的博客 128

linux framebuffer 显示bmp图片

ramebuffer简介      帧缓冲(framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。framebuffer是LCD对应的一中HAL(硬件抽象层),提供抽象的,统一的接口操作,用户不必关心硬件层是怎么实施的。这些都是由Framebuffer设备驱动来完成的。      帧缓冲设备对应的设

yhf19881015的专栏 818

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

嵌入式Linux下framebuffer显示BMP图片源码包:项目的核心功能/场景

嵌入式Linux下framebuffer显示BMP图片源码包:项目的核心功能/场景 去发现同类优质开源项目:https://gitcode.com/ 在嵌入式系统开发中,实现对图像的显示是一个常见需求。嵌入式Linux下framebuffer显示BMP图片源码包正是为此而生,为开发者提供了一个简洁高效的解决方案。 项目介绍 嵌入式Linux下framebuffer显示BMP图片源码包,是一款专门为...

gitblog_06729的博客 797

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Linux下提取bmp图片颜色信息生成fb文件并用framebuffer显示

【本人尊重原作者劳动成果,如涉及侵权请联系删除】 Linux的framebuffer是一种很简单的显示接口,直接写入像素信息即可。   配置好的内核,会有/dev/fbn(其中n=0,1,2,3……)的接口,于是有一个想法:能否提前生成一个文件,比如data.fb,里面仅包含像素信息,从而可以直接送入framebuffer显示。   搜索了一下,有不少文章介绍如何解析bmp图片并送给fr

u014575923的博客 3054

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Linux: Framebuffer显示bmp图片

初始化# fbset -fb /dev/fb0 -g 800 600 800 600 32 -n显示bmp图片文件# cat 32bit.bmp > /dev/fb0

TODO: Android; Linux; Cloud; 3610

linux bmp图片应用编程,在Framebuffer下编程显示BMP图象 分享

http://yaos.blog.sohu.com/20240931.html今天看别人的代码,知道可以使控制台进入图形模式,这样SHELL程序的显示就不会影响BMP图像的显示了。于是,COPY过来,放入自己先前的那个程序,再整个800x600的BMP图,试试全屏显示的效果!爽^0^爽/*showbmp.callenyao 2006/11/10*/#include #include #includ...

weixin_29238147的博客 483
上一篇: setjmp和longjmp函数使用详解
下一篇: shell 脚本报错^M: syntax error near unexpected token
xianjian_x
博客等级 码龄14年 231粉丝 43原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值