ubuntu12.10 32位系统使用framebuffer显示24深度bmp文件

2023-11-08

参考了网上很多例子,但是大多数都是有问题,只能显示部分,而且图片不是很清楚,在csdn上下载了一个代码是ok的。

总结一下就是:

1.mmap的大小如何确定

2.bmp文件的保存顺序是由下到上层的。

3.fread( (char *)&pix, 1, sizeof(PIXEL), fp);每次读取bmp一个像素的结构体,那么这个结构体的成员变量都是char类似,对于24深度的BMP文件要保证整个结构体大小为3.

那么32位的实现就更加简单,只要修改一行代码即可。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <asm/types.h>
#include <string.h>
#include <errno.h>
#include <sys/user.h>
#include <linux/fb.h>
#include <malloc.h>

#include "fbv.h"
#define BMP_TORASTER_OFFSET 10
#define BMP_SIZE_OFFSET 18
#define BMP_BPP_OFFSET 28
#define BMP_RLE_OFFSET 30
#define BMP_COLOR_OFFSET 54
int openFB(const char *name);
void closeFB(int fh);
void getVarScreenInfo(int fh, struct fb_var_screeninfo *var);
void getFixScreenInfo(int fh, struct fb_fix_screeninfo *fix);
#define fill4B(a) ( ( 4 - ( (a) % 4 ) ) & 0x03)

struct color {
unsigned char red;
unsigned char green;
unsigned char blue;
};

int show_pic(char*filename,int*x_offs,int*y_offs,int *rot);

int openFB(const char *name)
{
int fh;
char *dev;

if(name == NULL){
dev = getenv("FRAMEBUFFER");
if(dev) name = dev;
else name = DEFAULT_FRAMEBUFFER;
}

if ((fh = open(name, O_RDWR)) == -1){
fprintf(stderr, "open %s: %s\n", name, strerror(errno));
exit(1);
}
return fh;
}

void closeFB(int fh)
{
close(fh);
}
void getVarScreenInfo(int fh, struct fb_var_screeninfo *var)
{
if (ioctl(fh, FBIOGET_VSCREENINFO, var)){
fprintf(stderr, "ioctl FBIOGET_VSCREENINFO: %s\n", strerror(errno));
exit(1);
}
}

void getFixScreenInfo(int fh, struct fb_fix_screeninfo *fix)
{
if (ioctl(fh, FBIOGET_FSCREENINFO, fix)){
fprintf(stderr, "ioctl FBIOGET_FSCREENINFO: %s\n", strerror(errno));
exit(1);
}
}

int show_pic(char*filename,int*x_offs,int*y_offs,int *rot )
//int bmp_display(unsigned char *rgbbuff,int x_size, int y_size,int*x_offs,int*y_offs,int bpp)
{
uint32_t offset;
uint8_t color[4];
int width = 0, height = 0;
char tmp_buff[1*1*3] = "";
char* tmp = &tmp_buff;//(unsigned char *)(rgbbuff);
unsigned long fb_mem_offset;
unsigned long fb_mem;
struct fb_var_screeninfo var;
struct fb_fix_screeninfo fix;
int fd, raster, k, skip;
unsigned char buff[4];
//unsigned char *wr_buffer = buffer + x*(y-1)*3;
struct color pallete[256];
char filename1[] = "./1-24.bmp";

int x_size = 800;
int y_size = 600;
int bpp = 0;
int fh=-1;
fh = openFB(NULL);

int i=0,j=0;
int bit4_flag = 0;
int bit2_flag = 0;
printf("x_size=%d y_size=%d\n", x_size, y_size);
printf("x_offs=%d y_offs=%d\n", *x_offs, *y_offs);
getVarScreenInfo(fh, &var);
getFixScreenInfo(fh, &fix);

fb_mem_offset = (unsigned long)(fix.smem_start) & (~PAGE_MASK);
fb_mem = (unsigned long int)mmap(NULL, fix.smem_len + fb_mem_offset,
PROT_READ | PROT_WRITE, MAP_SHARED, fh, 0);
if (-1L == (long)fb_mem)
{
printf("mmap error! mem:%ld offset:%ld\n", fb_mem, fb_mem_offset);
return -1;
}
printf("mmap fix.smem_len:%d fb_mem_offset:%d (~PAGE_MASK)=%d\n", fix.smem_len, fb_mem_offset, (~PAGE_MASK));
printf("fix.smem_len + fb_mem_offset=%d y_size=%d\n", (fix.smem_len + fb_mem_offset), y_size);
width = *x_offs + x_size;
height = *y_offs + y_size;
fd = open(filename1, O_RDONLY);
if (fd == -1) {
return(FH_ERROR_FILE);
}

if (lseek(fd, BMP_TORASTER_OFFSET, SEEK_SET) == -1) {
return(FH_ERROR_FORMAT);
}
read(fd, buff, 4);
raster = buff[0] + (buff[1]<<8) + (buff[2]<<16) + (buff[3]<<24);

if (lseek(fd, BMP_BPP_OFFSET, SEEK_SET) == -1) {
return(FH_ERROR_FORMAT);
}
read(fd, buff, 2);
bpp = buff[0] + (buff[1]<<8);


lseek(fd, raster, SEEK_SET);
for(i = *y_offs; i < height; i++)
{
for(j = *x_offs; j < width; j++)
{
// DBG_INFO("i=%d--j=%d\n",i, j);
switch (bpp)
{
case 24:
memset(tmp_buff, 0, 3);
read(fd, tmp, 3);
color[0] = tmp[2];
color[1] = tmp[1];
color[2] = tmp[0];
color[3] = 0x00;
offset = (j + var.xoffset) * (var.bits_per_pixel/8) + (y_size - i + var.yoffset) * fix.line_length;
memcpy((void*)(fb_mem + offset), color, 4);
// tmp = tmp + 3;

break;
default:
printf("BMP BitCount isn't 1/4/8/24, so is err!\n");
}
}

}
closeFB(fh);
return 0;
}
int main(int argc,char *argv[])
{
char *filename;
int rot,x_offs,y_offs;

if(argc < 2)
{
// help(argv[0]);
fprintf(stderr, "Error: Required argument missing.\n");
return(1);
}

filename = argv[1];
if(argv[2]==NULL)
x_offs = 0;
else {x_offs =atoi(argv[2]);}

if(argv[3]==NULL)
y_offs = 20;
else y_offs =atoi(argv[3]);

if(argv[4]==NULL)
{
rot = 0;
}
else rot =atoi(argv[4]);

if(show_pic(filename,&x_offs,&y_offs,&rot))
//if(show_pic(filename,&x_offs,&y_offs,&rot))
{
printf("Error!Cannot display the picture!\nI'm main()!\n");
return -1;
}
printf("--------------------------------------------------------------------------------------------------------------------------------\n");
return 0;
}

//fbv.h文件内容

#define FH_ERROR_OK 0
#define FH_ERROR_FILE 1        /* read/access error */
#define FH_ERROR_FORMAT 2    /* file format error */
#define DEFAULT_FRAMEBUFFER "/dev/fb0"

int bmp_display(unsigned char *rgbbuff,int x_size, int y_size,int*x_offs,int*y_offs,int bpp);

int fh_bmp_load(char *name,unsigned char *buffer, unsigned char **alpha, int x,int y,int *bpp);
int fh_bmp_getsize(char *name,int *x,int *y);

/*
int fh_jpeg_load(char *name,unsigned char *buffer, unsigned char **alpha, int x,int y);
int fh_jpeg_getsize(char *name,int *x,int *y);

int fh_png_load(char *name,unsigned char *buffer, unsigned char **alpha, int x,int y);
int fh_png_getsize(char *name,int *x,int *y);

int fh_gif_load(char *name,unsigned char *buffer, unsigned char **alpha, int x,int y);
int fh_gif_getsize(char *name,int *x,int *y);
*/
struct image
{
    int width, height;
    unsigned char *rgb;
    unsigned char *alpha;
    int do_free;
};

#ifndef min
#define min(a,b) ((a) < (b) ? (a) : (b))
#endif
#ifndef max
#define max(a,b) ((a) > (b) ? (a) : (b))
#endif


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ubuntu12.10 32位系统使用framebuffer显示24深度bmp文件 的相关文章

  • 01-----Ubuntu16.04安装Gnome桌面环境

    从这篇起 我将使用Ubuntu16 04来搭建流媒体开发的环境 这是Ubuntu16 04空虚拟机的开始文章虚拟机下配置linux的网络上网 包括ssh gcc g 的安装 几乎所有软件的搭建都是从零开始 上面安装好能上网后 本篇将讲述关于
  • E: Sub-process /usr/bin/dpkg returned an error code (1)

    执行命令 apt update apt dist upgrade apt update apt dist upgrade 是由于apt get安装软件时出现了类似于 注意 根据搜索得知 var lib dpkg info下保存有各个软件包的
  • 2022年前端面试题整理,持续更新中

    端面试题整理 已同步到掘金 CSDN 掘金地址 https juejin cn post 7075332630417244173 CSDN 地址 https blog csdn net z1832729975 article details
  • 一种3D视频格式转换(H264 MVC至SBS / OU)方案

    本文尚处于草稿状态 提前公开仅供预览 前言 两年前我就想写这个话题的文章 但一直拖延到现在 因为我在等待SkyBox VR Player支持3D MVC 我在想 如果3D播放器已经支持播放3D MVC格式 那么MVC至SBS转换就没有必要
  • spring中配置DButil数据源

    1 pom引入
  • web服务器群集-Nginx

    关于Nginx 一款高性能 轻量级Web服务软件 系统资源能耗低 对HTTP并发连接的处理能力高 单台物理服务器可支持3000 5000个并发请求 1 Nginx编译安装 安装支持软件 yum y install pcre devel zl
  • Maven打包时出现Process terminated错误

    Maven打包时出现Process terminated错误 检查maven的配置文件 多引入了一次控制器 编码错误 切点表达式错误 用maven打包时出现Process terminated样式的错误 报错如下 查看报错信息 检查mave
  • HDS 多路径软件HDLM for AIX安装及配置—精简范例篇

    HDS 多路径软件HDLM for AIX安装及配置 精简范例篇 aix 6 HDS VSP HDLM DLManager mpio rte HDLM Hitachi Dynamic Link Manager 是HDS公司提供的安装在主机端
  • Spring Data JPA学习笔记

    文章目录 Spring Data JPA 环境搭建 基本CRUD 分页 排序 基于规则自定义方法 基于Query注解方法 Spring Data JPA JPA字面意思是JAVA持久层API JPA定义了一系列标准 建立了实体类和数据库中表
  • CentOS7安装使用中文字符集的方法(转)

    通常安装Linux系统本着最简化安装 会默认使用英文字符集 不会安装中文字符集等其他字符 但是在一些必要情况下需要中文的支持 本文将以CentOS7为例演示下如何安装中文字符集 1 首先使用locale命令看看当前系统所使用的字符集 如图可
  • C语言 合并有序数组

    将2个已知有序的数组合并为一个新的有序数组 已有两个数组 arr1 和 arr2 要求将两个数组中元素合并到数组 arr3 中 合并时要去除数组中的重复数据 include
  • NLP学习(十四)-NLP实战之文本分类-中文垃圾邮件分类-Python3

    一 文本分类实现步骤 定义阶段 定义数据以及分类体系 具体分为哪些类别 需要哪些数据 数据预处理 对文档做分词 去停用词等准备工作 数据提取特征 对文档矩阵进行降维 提取训练集中最有用的特征 模型训练阶段 选择具体的分类模型以及算法 训练出
  • requests爬取网易云音乐

    访问网易云音乐 查找搜索接口的信息 发现搜索的接口没有想要的信息 我又去找其他接口 最后发现信息在这里 而且请求的接口是post的请求头 我换了种方式爬取 用selnium的方式 最后的成果是这样的 不打了 手累 不懂得可以问我 impor
  • 设置激光驱动器电流

    激光二极管在驱动电流过大的情况下较容易损坏 所以在调整激光驱动电路时 用测试负载来代替激光二极管 测试负载与激光二极管类似 但不像激光二极管会被过量的电流损坏 当我们将驱动电流设置到合适之后 测试负载便可以用激光二极管代替 测试负载 测试负
  • Unity3D 旋转天空盒的方法

    天空盒是不能旋转的 但我们可以旋转摄像机来达到天空盒的旋转效果 实现方法如下 1 我们创建一个摄像机名为Skybox Camera 2 主摄像机Main Camera的Clear Flags设置为Don t Clear 3 Skybox C
  • 【离线文本转语音文件】java spring boot jacob实现文字转语音文件,离线文本转化语音,中英文生成语音,文字朗读,中文生成声音,文字生成声音文件,文字转语音文件,文字变声音。

    1 实现效果如下 输入文字 支持中英文 点击转换生成 wav文件 点击下载到本地就可 生成后的音频文件播放 时长1分8秒 2 实现代码 这次采用jacob实现 相比百度AI需要联网 本项目定位内网环境实现 所以最终采jacob 1 环境配置
  • LaTeX数学公式的符号表示

    引言 由于CSDN的Markdown编辑器能轻松地支持 LATEX LaTeX的公式表示 因此 今天我们来细数一下 LATEX LaTeX数学公式的符号表示 以便大家以后随时查用 1 强调模式 a a hat a check a a a a
  • Keywords Search 【HDU - 2222】【AC自动机模板】

    题目链接 学习AC自动机的第一道题 可能跟广大学友是一样的 让我知道了什么是AC自动机 具体讲一下吧 它就是用来求多串匹配的 而KMP只是求单串匹配的 相当于是在KMP上做了优化 之后 就是怎么构造AC自动机了 知道它就是在一棵字典树上做文
  • 最大连续子数组和

    最大连续子数组和 动态规划 迭代求出以i结尾的最大连续和 i 1结尾的最大连续和时和前一位的状态有关 列出递推式即可求解 class Solution public int FindGreatestSumOfSubArray vector

随机推荐

  • PHP多个三目运算符的坑

    废话不多说直接上代码 source gt item source self 自建 item source erp 精选 item source free 免费 大牌好货 有一天看到项目里面的代码 这样写的 多个三目运算符一起限定 项目一直在
  • ChatGPT将要颠覆的前十个行业

    ChatGPT将要颠覆的前十个行业 内容创作 ChatGPT可以生成高质量的文章 新闻和其他类型的文本内容 改变传统内容创作行业 在线客服 ChatGPT可以提供智能 高效的客户服务 改善用户体验 降低企业成本 教育领域 ChatGPT可作
  • react native 实现拖拽排序

    先上效果图 意思意思 其实原理很简单 没有想的那么难 大家在改造的时候 请注意 this offset 的值 因为它关系到查找目标box的index 原理 手势释放时 所在的坐标值来推算出目标box的Index 本文代码可读性还需要改造 代
  • assert函数_【C语言笔记】assert怎么用?

    一 什么是assert 编写代码时 我们总是会做出一些假设 断言 assert 就是用于在代码中捕捉这些假设 可以将断言看作是异常处理的一种高级形式 断言表示为一些布尔表达式 程序员相信在程序中的某个特定点该表达式值为真 可以在任何时候启用
  • 华为RH2288 V3服务器新加硬盘不识别

    华为服务器RH2288 V3原本6块本地硬盘配置RAID5 后新加入2块本地硬盘配置RAID RAID卡类型LSI SAS3108 时 不能被BIOS Configuration Utility界面VD Mgmt页签识别到处理方法 首先 检
  • 别收藏 Excel 函数大全了!北大硕博生为帮助女朋友,开发了个 ChatExcel,一键处理表格...

    整理 苏宓 出品 CSDN ID CSDNnews 众所周知 Excel 是一款应用广泛的办公软件 也是世界上使用最广泛语言的编程语言 还是一款优秀的低代码工具 然而 想要真正玩转它 不仅需要学会各种各样的 Excel 函数公式 也需要熟练
  • 解决SCP命令需要输入密码的问题

    需求 主机A ipA 文件复制到主机B ipB step1 主机A生成配对秘钥 在root目录下执行 ssh keygen t rsa step 2 将 ssh 目录中的 id rsa pub 文件复制到 主机B 的 ssh 目录中 并改名
  • 【蓝桥杯(51) STC15F2K60S2】之 “独立按键实验“

    相关代码 include STC15F2K60S2 H unsigned char KeyNumber unsigned char value unsigned char code SMG weixu 18 0xc0 0xf9 0xa4 0
  • [AI医学] llm-medical-data:用于大模型微调训练的医疗数据集

    关键词 医疗数据集 大模型微调训练 开源项目 llm medical data 用于大模型微调训练的医疗数据集 项目地址 https github com donote llm medical data 该项目主要参考了几篇关于医学领域大模
  • root用户登录tab有时无法补齐

    ubuntu bash 自动补齐 打开 bashrc把最后的注释 etc bash completion的三行打开 debian下增强bash的自动补全功能 根据zhllg的提示 在debian下增强了自动补齐功能 现在很多命令的参数也可以
  • Scrapy爬虫部署、相关api调用、以及gerapy的作用和使用流程总结

    scrapy部署介绍相关的中文文档地址 https scrapyd readthedocs io en latest 安装相关库 scrapyd 是运行scrapy爬虫的服务程序 它支持以http命令方式发布 删除 启动 停止爬虫程序 而且
  • 函数返回引用

    include
  • QString转Char*字符串

    QString转Char 字符串 在Qt下将QString转char 需要用到QByteArray类 因为char 最后都有一个 0 作为结束符 而采用QString toLatin1 时会在字符串后面加上 0 方法如下 int main
  • Hive聚合运算

    Hive聚合运算 Hive聚合运算 GROUP BY HAVING 基础聚合 高级聚合 Hive聚合运算 GROUP BY group by用于分组 Hive基本内置聚合函数与group by一起使用 如果没有指定group by子句 则默
  • P4047 [JSOI2010]部落划分

    题目链接 这道题一看最小值最大 很容易被误导进二分答案的思路 但实际上并不需要二分答案 其实正解是最小生成树 我们先预处理出原图的最小生成树 因为要分k个部落 所以我们先把最小的n k边先全部选走 因为我们用kruskal的话要用到并查集
  • QA工具开发流程

    前言 在项目上线前期 这边根据需求制作了一套QA测试工具 主要分为以下四个模块的测试 图1 数值测试 主要包括了角色的等级变更 游戏里货币的变更 目前已制作的 游戏道具的数量变更 这些可能归一为一类测试模型 动画测试 包括角色的控制系统的所
  • 直流电机驱动PWM频率(转)

    源 直流电机驱动PWM频率 1 没有统一的标准 其实PWM的频率和你的电机感抗和你需要的速度响应时间有很大的关系 一般的电机用14K就足够了 当然自需要简单的调速可以随便选 如果电机转速比较高 感抗比较小 可以使用比较高的频率 一般最好不要
  • 【详细】使用MkDocs搭建个人博客网站

    使用MkDocs搭建个人博客网站 0 安装python3 7 注意 可以在个人用户下安装 不要覆盖系统原有python 下载Python依赖环境 yum install gcc patch libffi devel python devel
  • 并发编程(线程)面试题总结2022

    目录 并发编程三要素是什么 在 Java 程序中怎么保证 多线程 的运行安全 什么是多线程 多线程的优劣 形成死锁的四个必要条件是什么 创建线程有哪几种方式 继承 Thread 类 实现 Runnable 接口 实现 Callable 接口
  • ubuntu12.10 32位系统使用framebuffer显示24深度bmp文件

    参考了网上很多例子 但是大多数都是有问题 只能显示部分 而且图片不是很清楚 在csdn上下载了一个代码是ok的 总结一下就是 1 mmap的大小如何确定 2 bmp文件的保存顺序是由下到上层的 3 fread char pix 1 size