文章目录

  • 前言
  • 图片显示
    • 1.普通全屏(800*480)显示bmp
    • 2.在任意位置显示任意大小bmp图片
  • 头文件

前言

Linux系统,GEC6818,800*480,bmp图片


图片显示

由文件IO实现(open,read,write)。

1.普通全屏(800*480)显示bmp

代码如下(示例):

//显示完整图片的接口函数
void show_bmp(char *photoname)
{//存储图片像素信息char bmpbuf[800*480*3];int tmpbuf[800*480];int lastbuf[800*480];int i = 0,x = 0,y = 0;//打开BMP图片int bmpfd = open(photoname,O_RDWR);if(bmpfd == -1){//printf("完整bmp:%s\n",buf);perror("open 完整bmp");return;}//打开lcd驱动int lcdfd=open("/dev/fb0",O_RDWR);if(lcdfd==-1){perror("open");return;}lseek(bmpfd,54,SEEK_SET);  //从头偏移图片属性信息54个字节read(bmpfd,bmpbuf,800*480*3);  //读取图片数据/* 转换数据格式 */for(i=0; i<800*480; i++)tmpbuf[i] = 0x00<<24|bmpbuf[i*3+2]<<16|bmpbuf[i*3+1]<<8|bmpbuf[i*3];//按行翻转for(x=0; x<800; x++)for(y=0; y<480; y++)lastbuf[(479-y)*800+x]=tmpbuf[y*800+x];int *p = mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED, lcdfd, 0);    if(p==MAP_FAILED){perror("mmap");return;}   for(i=0; i<800*480; i++)p[i]= lastbuf[i];//4.关闭文件解除内存映射munmap(p,800*480*4);close(lcdfd);close(bmpfd);    return;
}

2.在任意位置显示任意大小bmp图片

代码如下(示例):

void anywhere_InsertPhoto(int x_setoff,int y_setoff,
int width_photo,int high_photo,char *pathname)
{//printf("ccc\n");//打开bmp图片int bmpfd = open(pathname,O_RDWR);if (bmpfd == -1){perror("open bmp2");return;}//打开液晶屏的设备int lcdfd = open("/dev/fb0",O_RDWR);if (lcdfd == -1){perror("open");return;}//准备buf储存图片的像素点信息char bmpbuf[width_photo*high_photo*3];int  tmpbuf[width_photo*high_photo];int  lastbuf[width_photo*high_photo];//跳过图片头信息的54个字节lseek(bmpfd,54,SEEK_SET);//保存每一行的无效字节int invalid_byte = (4-(width_photo*3)%4)%4;//按行读取bmp图片的信息,跳过无效字节for (int i= 0; i<high_photo; ++i){read(bmpfd,&bmpbuf[i*width_photo*3],3*width_photo);lseek(bmpfd,invalid_byte,SEEK_CUR);}//将读取到的三字节像素点RGB填充到lcd的四字节像素点ABGR上for (int i = 0;i < width_photo*high_photo; ++i){tmpbuf[i] = 0x00<<24|bmpbuf[3*i+2]<<16|bmpbuf[3*i+1]<<8|bmpbuf[3*i];}//将读取到的四字节像素点按行中间翻转for (int i = 0; i < width_photo; ++i)for (int j = 0; j < high_photo; ++j){lastbuf[(high_photo-1-j)*width_photo+i] = tmpbuf[j*width_photo+i];}//内存映射int *mmpfd = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcdfd,0);for (int i = 0; i < high_photo; ++i)for (int j = 0; j < width_photo; ++j){mmpfd[(i+y_setoff)*800+x_setoff+j] = lastbuf[i*width_photo+j];}//释放内存//不能随意释放,内存发生偏移//munmap(mmpfd,800*480*4);//关闭文件close(bmpfd);close(lcdfd);return;
}

头文件

#ifndef HEAD_H
#define HEAD_H#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <errno.h>
#include <dirent.h>
//#include <sys/ioctl.h>
//#include <linux/input.h>
//#include <sys/mman.h>
#include <stdbool.h>#endif

bmp图片显示(任意位置任意大小)相关推荐

  1. 【Android SDM660源码分析】- 03 - UEFI XBL GraphicsOutput BMP图片显示流程

    [Android SDM660源码分析]- 03 - UEFI XBL GraphicsOutput BMP图片显示流程 1. GraphicsOutput.h 2. 显示驱动初化 DisplayDx ...

  2. 开发板BMP图片显示(6818开发板)

    BMP图片的前54个字节保存图片信息,不保存像素点 确认图片是不是BMP类型,读取整个图片大 #pragma pack (1)typedef struct tagBITMAPFILEHEADER{ u ...

  3. emwin从外部flash中读取bmp图片显示

    在emwin中有提供了一个从外部读取图片数据进行显示的函数,如下: 而且提供了官方例程,不过官方历程中从外部读取是从外部文件系统中进行读取的bmp图片进行显示,官方例程如下 /* ********** ...

  4. 【紫光同创国产FPGA教程】【第十四章】SD卡读取BMP图片显示例程

    本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处(http://www.alinx.com). 1. 实验简介 在前面的实验中我们练习了SD卡读 ...

  5. 嵌入式开发板bmp图片显示

    一.bmp图的实现(bitmap位图) 1.怎样去制作位图bmp图 画图软件工具 2.bmp图分辨率  800*480个像素点 3.图片的像素点是多少个字节  1个像素点 = 3个字节 4.大小  8 ...

  6. cad指北针lisp_用CAD里的LISP画图,题目如图片,编写一程序,可在任意位置任意方向绘制指定大小的指北针。...

    写了一个,图如下: Autolisp代码如下:(defunc:tes(/&ang1&ang2&dis1&ent1&kw1&p1&p2&p ...

  7. activiti高亮显示图片_【正点原子FPGA连载】第二十章SD卡读BMP图片HDMI显示实验领航者 ZYNQ 之嵌入式开发指南...

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  8. 粤嵌gec6818LED屏幕上画图 太极图 图片显示 电子相册 2048小游戏 实现识别触摸坐标的识别 电子自助点餐设计等项目

    交叉开发     在一个有编辑/编译功能的PC机上进行编辑/编译,生成的可执行文件通过     交叉开发工具下载到目标机(GEC-6818)          开发板 --- Linux内核 --- ...

  9. 用F5529控制OLED输出汉字,字符,以及bmp图片

    基于F5529以及G2553的OLED显示 本文主要是给出F5529以及G2553的工程,然后针对如何使用文件里的函数进行说明.对于OLED的原理不进行细致说明. OLED的I2C时钟一定要配置准确, ...

最新文章

  1. Javascript正则匹配不含某子串
  2. 了解多线程中的yield
  3. pilt图像处理_Python用Pillow(PIL)进行简单的图像操作
  4. 数据中心成为生态系统向绿色氢经济转变的催化剂
  5. 就喜欢用vSphere部署K8s集群,不全是因为自动化!
  6. mysql 以 db 结尾_MySQL的高级部分
  7. springdata学习笔记-01-helloworld-(暂时不全223)
  8. asp 连接mysql_如何在ASP中连接MySQL数据库
  9. 软件工程复习提纲——第十章
  10. cad和python哪个好学_cad制图工资一般多少 就业前景好不好
  11. vue实现页面权限显示_Vue 实现前端权限控制
  12. java 自己实现工作流_Java基于jeeplus vue实现简单工作流过程图解
  13. c语言vs2013下载官方下载,Microsoft Visual C++2013运行库下载
  14. 土巴兔上市未卜,群核科技换个姿势能否撑起“3D云设计第一股”?
  15. 胡因梦-生命的不可思议
  16. 微信公众号申请相关问题
  17. 阿古斯机器人_7.3.2暗牧神器燃烧王座语音
  18. HTML5期末大作业:商城网站设计——仿唯品会购物商城(5页) 纯手写-高质量 HTML+CSS+JavaScript
  19. [保护过保护] _EPROCESS 的 Protection 成员
  20. Web渗透测试_目录遍历

热门文章

  1. 关于 vue 数据请求 本地跨域 和 线上请求的 ip地址 切换 问题
  2. Trafodion ROLLUP函数
  3. IE重新装ActiveX控件
  4. 新玩意 扩展主机省钱又方便赛过无盘(转)
  5. C语言之格式化输出字符
  6. 【开源】知乎视频播放器 Griffith 介绍
  7. 树莓派linux系统配置AODV协议,linux上模拟AODV路由协议 下面一些信息求各路大神解释!!...
  8. Oracle 数据误删的恢复措施
  9. jsp onpropertychange
  10. Android 文件下载,根据url获取真正的文件名和后缀名(包括重定向的url)