bmp图片显示
文件IO项目:
在开发板屏幕上循环显示目录里的图片
a.按照一定的间隔循环显示目录里的bmp图片
b.实现手指滑动来显示目录里的图片(bmp,jpg)上一张,下一张
d1:
1.能操控屏幕(查询开发板屏幕分辨率,以及每个像素点占几个字节)
命令:FBIOGET_VSCREENINFO
查询结果保存在些结构中:
struct fb_var_screeninfo fbinfo;
__u32 xres; 屏幕分辨率
__u32 yres;
__u32 bits_per_pixel; 每个像素点占多少位 /* guess what */
ioctl(fd,FBIOGET_VSCREENINFO,&fbinfo);
1.control device
控制设备
int ioctl(int fd, int request, ...);
fd:文件描述符,表示要操作的设备
request:一般表示一个命令号,该命令由驱动开发者提供
...:其它参数,不同的命令参数是不一样的,也由驱动程序员提供
返回值:返回0
失败-1
------------------------------------------------
2.功能:映射一个文件或设备到内存,实现像操作普通内存一样去操作文件或设备
void *mmap(
void *addr, 把文件内容映射到内存哪个地址,给NULL,让操作系统自动分配
size_t length,要映射的文件内容的长度
int prot, 映射的内存区域的权限
PROT_EXEC 可执行
PROT_READ 可读
PROT_WRITE 可写
int flags,映射标志,决定对映射部分的操作是否对其它进程可见
MAP_SHARED:共享的,对其它进程可见,内存操作直接应用到文件中去
MAP_PRIVATE:私有的,对其它进程不可见,内存操作不应用到文件中去
int fd,文件描述符,要映射的文件
off_t offset 偏移量,表示文件从哪个位置开始映射
);
返回值:成功返回映射内存区域的首地址
失败返回 MAP_FAILED(-1),同时errno被设置
int munmap(void *addr, size_t length);
功能:解除映射
addr:mmap的返回值
length:映射内存的长度
返回值:成功返回0
失败返回-1
void *memset(void *s, int c, size_t n);
s:要设置的内存首地址
c:要设置的内容
n:长度
//struct student s;
//memset(&s,0,sizeof(s));
//void *memcpy(void *dest, const void *src, size_t n);
memcpy(addr,gImage_cat2,800*480*4);
2.显示图片
-----------------------------------------
Linux Frame Buffer:
帧缓冲设备:
是对具体图像硬件的一个抽像,它让上层图像应用程序不必关心具体的硬件实现细节。
在内存(显存)中开辟一段空间,用来保存在屏幕上像素点的颜色值,然后操作屏幕就直接操作这段内存就可以了,这就是说的帧缓冲。
LCD显示原理:
屏幕是由y行且每行x个像素点的矩阵组成
在屏幕上显示图像就是给每个像素点显示一个颜色。
帧缓冲设备操作流程:
1.open打开设备
2.ioctl获取屏幕信息
3.mmap映射设备到内存
4.操作显存
5.munmap解除映射
6.close关闭文件
/*************************************************************************
> File Name: fb_test.c
> Author: csgec
> Mail: longer.zhou@gmail.com
> Created Time: Wed 03 Aug 2016 10:26:59 AM CST
************************************************************************/
#include <stdio.h>
#include <sys/ioctl.h>
#include <linux/fb.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <string.h>
//#include "cat2.h"
int main(int argc,char *argv[])
{
//1.open device
int fb = open(argv[1],O_RDWR);
if(fb < 0)
{
perror("open");
return -1;
}
//2.查询开发板屏幕分辨率,以及每个像素点占几个字节
struct fb_var_screeninfo fbinfo;
int res = ioctl(fb,FBIOGET_VSCREENINFO,&fbinfo);
if(res != 0)
{
perror("ioctl");
return -1;
}
printf("x = %d\n",fbinfo.xres);
printf("y = %d\n",fbinfo.yres);
printf("char_per_pixel = %d\n",fbinfo.bits_per_pixel/8);
//3mmap
void *addr = mmap(0,800*480*4,PROT_READ | PROT_WRITE,MAP_SHARED,fb,0);
if(addr == MAP_FAILED)
{
perror("mmp");
return -1;
}
printf("addr = %#x\n",addr);
printf("mmp ok\n");
int i ;
/*
int *p = (int*)addr;
for(i = 0; i < 800*480; i++ )
{
p[i] = 0xff0000;//red color
}
printf("-----\n") ;
*/
char buf[800*480*4];
int bmp_fd = open(argv[2],O_RDONLY);
// read(bmp_fd,buf,54);//读掉图片头信息
lseek(bmp_fd,54,SEEK_SET);
res = read(bmp_fd,buf,sizeof(buf));
printf("res = %d\n",res);
memcpy(addr,buf,800*480*4);
//4.解除映射
munmap(addr,480*800*4);
close(fb);
return 0;
}
/*************************************************************************
> File Name: fb_test.c
> Author: csgec
> Mail: longer.zhou@gmail.com
> Created Time: Wed 03 Aug 2016 10:26:59 AM CST
************************************************************************/
#include <stdio.h>
#include <sys/ioctl.h>
#include <linux/fb.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <string.h>
void draw_point(int *p,int x,int y,int color)
{
int *pf = p + (800*y + x);
*pf = color;
}
void draw_bmp(int *pfb,char *bmp)
{
printf("draw_bmp\n");
char *p = bmp;
int i,j,color;
unsigned char r,g,b;
for(i = 0; i < 480; i++)
{
for(j = 0; j < 800; j++)
{
/*
r = bmp[(i*800+j)*3 + 0];
g = bmp[(i*800+j)*3 + 1];
b = bmp[(i*800+j)*3 + 2];
*/
r = *p++;
g = *p++;
b = *p++;
color = (b << 16) | (g << 8) | r;
draw_point(pfb,j,479-i,color);
}
}
}
int main(int argc,char *argv[])
{
//1.open device
int fb = open(argv[1],O_RDWR);
if(fb < 0)
{
perror("open");
return -1;
}
//2.查询开发板屏幕分辨率,以及每个像素点占几个字节
struct fb_var_screeninfo fbinfo;
int res = ioctl(fb,FBIOGET_VSCREENINFO,&fbinfo);
if(res != 0)
{
perror("ioctl");
return -1;
}
printf("x = %d\n",fbinfo.xres);
printf("y = %d\n",fbinfo.yres);
printf("char_per_pixel = %d\n",fbinfo.bits_per_pixel/8);
//3mmap
void *addr = mmap(0,800*480*4,PROT_READ | PROT_WRITE,MAP_SHARED,fb,0);
if(addr == MAP_FAILED)
{
perror("mmp");
return -1;
}
printf("addr = %#x\n",addr);
printf("mmp ok\n");
char buf[800*480*3];
int bmp_fd = open(argv[2],O_RDONLY);
// read(bmp_fd,buf,54);//读掉图片头信息
lseek(bmp_fd,54,SEEK_SET);
res = read(bmp_fd,buf,sizeof(buf));
printf("res = %d\n",res);
draw_bmp(addr,buf);
//4.解除映射
munmap(addr,480*800*4);
close(fb);
return 0;
}
bmp图片显示的更多相关文章
- 【emWin】例程十:bmp图片显示
实验指导书及代码包下载: 链接:http://pan.baidu.com/s/1i5fr2Ep 密码:vlvt 实验现象:
- 提取bmp图片的颜色信息,可直接framebuffer显示(c版本与python版本)
稍微了解了下linux的framebuffer,这是一种很简单的显示接口,直接写入像素信息即可 配置好的内核,会有/dev/fbn 的接口,于是想能否提前生成一个文件,比如logo.fb,里面仅包含像 ...
- MFC对话框显示BMP图片
1.MFC对话框显示BMP图片我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) ...
- Python中通过Image的open之后,去show结果打不开bmp图片,无法正常显示图片
在windows的cmd命令行下,使用Python的PIL库打开并显示一个jpg图片: ? 1 2 3 openedImg = Image.open(saveToFile); print " ...
- 在VC6中基于dll开发插件用于各种图片显示(BMP/TGA/JPG/GIF/PNG/TIF/ICO/WMF/EMF/...)
一.图片显示 图片显示的方法: 1. 直接写程序 2. 第3方库 3. 调用COM组件的IPicture接口 4. 使用MFC的CPictureHolder类 5. 使用GDI+的CImag ...
- 嵌入式linux------SDL移植(am335x下显示bmp图片)
#include<stdio.h> #include "/usr/local/ffmpeg_arm/include/SDL/SDL.h" char *bmp_name[ ...
- [转]opengl入门例题(读取bmp图片,并显示)
#include<gl/glut.h> #define FileName "bliss.bmp" static GLint imagewidth; static GLi ...
- Linux framebuffer显示bmp图片【转】
本文转载自:http://blog.csdn.net/luxiaoxun/article/details/7622988 framebuffer简介 帧缓冲(framebuffer)是Linux为显示 ...
- OPENGL 显示BMP图片+旋转
VS2010/Windows 7/ 1. 需包含头文件 stdio.h, glaux.h, glut.h.需要对应的lib,并添加包含路径 2. 窗口显示用glut库的函数 3. bmp图片从本地读取 ...
随机推荐
- hql 链接查询
第一部分.连接查询 一.内连接 内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值.内连接分三种: 1.等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询 ...
- java中把list列表转为arrayList以及arraylist数组截取的简单方法
java中把list列表转为arrayList以及arraylist数组截取的简单方法 package xiaobai; import java.util.ArrayList; import java ...
- Java去除字符串中的空格
特别注意了 Strim或者Trip都是只能去除头部和尾部的空字符串.中间的部分是不能够去除的! 推荐使用ApacheCommonse的StringUtils.deleteWhitespace(&quo ...
- Size Balanced Tree(SBT) 模板
首先是从二叉搜索树开始,一棵二叉搜索树的定义是: 1.这是一棵二叉树: 2.令x为二叉树中某个结点上表示的值,那么其左子树上所有结点的值都要不大于x,其右子树上所有结点的值都要不小于x. 由二叉搜索树 ...
- C++------------typedef 函数指针类型定义
摘要bycrazyhacking: typedef 是定义了一种"函数指针"类型,可以再声明很多变量.函数指针的定义是定义了一个变量. int max(int x,i ...
- maven bundle
今天引入了几个bundle到pom,尽然说missing,我还以为是nexus组织下载.把type=bundle去掉可以下载,后来同事给了我这个连接https://issues.apache.org/ ...
- iOS播放gif图方式
转发:http://www.cnblogs.com/jerehedu/ 图片分为静态和动态两种,图片的格式有很多种,在开发中比较常见的是.png和.jpg的静态图片,但有的时候在App中需要播放动态图 ...
- 多年心愿,终于完成,热泪盈眶啊。。。Adrew NG 的 机器学习
谢谢Andrew老师!谢谢Coursera!谢谢自己!希望这是一个好的开始!希望自己也能使用机器学习来make a better world...
- Runtime简介以及常见的使用场景(此内容非原创,为转载内容)
Runtime简称运行时,是一套比较底层的纯C语言的API, 作为OC的核心,运行时是一种面向对象的编程语言的运行环境,其中最主要的是消息机制,Objective-C 就是基于运行时的. 所谓运行时, ...
- ArcEngine部分工作总结
Arcengine工作总结地物点查询本部分可以在一个窗体中实现,也可以在两个窗体中实现.由于工作要求本人是在两个窗体中实现的:弹出窗体的名称为FormQuery主窗体单机查询时间的代码FormQuer ...