文件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图片显示的更多相关文章

  1. 【emWin】例程十:bmp图片显示

    实验指导书及代码包下载: 链接:http://pan.baidu.com/s/1i5fr2Ep 密码:vlvt 实验现象:

  2. 提取bmp图片的颜色信息,可直接framebuffer显示(c版本与python版本)

    稍微了解了下linux的framebuffer,这是一种很简单的显示接口,直接写入像素信息即可 配置好的内核,会有/dev/fbn 的接口,于是想能否提前生成一个文件,比如logo.fb,里面仅包含像 ...

  3. MFC对话框显示BMP图片

    1.MFC对话框显示BMP图片我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) ...

  4. Python中通过Image的open之后,去show结果打不开bmp图片,无法正常显示图片

    在windows的cmd命令行下,使用Python的PIL库打开并显示一个jpg图片: ? 1 2 3 openedImg = Image.open(saveToFile); print " ...

  5. 在VC6中基于dll开发插件用于各种图片显示(BMP/TGA/JPG/GIF/PNG/TIF/ICO/WMF/EMF/...)

    一.图片显示 图片显示的方法: 1.  直接写程序 2.  第3方库 3.  调用COM组件的IPicture接口 4.  使用MFC的CPictureHolder类 5.  使用GDI+的CImag ...

  6. 嵌入式linux------SDL移植(am335x下显示bmp图片)

    #include<stdio.h> #include "/usr/local/ffmpeg_arm/include/SDL/SDL.h" char *bmp_name[ ...

  7. [转]opengl入门例题(读取bmp图片,并显示)

    #include<gl/glut.h> #define FileName "bliss.bmp" static GLint imagewidth; static GLi ...

  8. Linux framebuffer显示bmp图片【转】

    本文转载自:http://blog.csdn.net/luxiaoxun/article/details/7622988 framebuffer简介 帧缓冲(framebuffer)是Linux为显示 ...

  9. OPENGL 显示BMP图片+旋转

    VS2010/Windows 7/ 1. 需包含头文件 stdio.h, glaux.h, glut.h.需要对应的lib,并添加包含路径 2. 窗口显示用glut库的函数 3. bmp图片从本地读取 ...

随机推荐

  1. hql 链接查询

    第一部分.连接查询 一.内连接 内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值.内连接分三种: 1.等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询 ...

  2. java中把list列表转为arrayList以及arraylist数组截取的简单方法

    java中把list列表转为arrayList以及arraylist数组截取的简单方法 package xiaobai; import java.util.ArrayList; import java ...

  3. Java去除字符串中的空格

    特别注意了 Strim或者Trip都是只能去除头部和尾部的空字符串.中间的部分是不能够去除的! 推荐使用ApacheCommonse的StringUtils.deleteWhitespace(&quo ...

  4. Size Balanced Tree(SBT) 模板

    首先是从二叉搜索树开始,一棵二叉搜索树的定义是: 1.这是一棵二叉树: 2.令x为二叉树中某个结点上表示的值,那么其左子树上所有结点的值都要不大于x,其右子树上所有结点的值都要不小于x. 由二叉搜索树 ...

  5. C++------------typedef 函数指针类型定义

    摘要bycrazyhacking:        typedef 是定义了一种"函数指针"类型,可以再声明很多变量.函数指针的定义是定义了一个变量. int max(int x,i ...

  6. maven bundle

    今天引入了几个bundle到pom,尽然说missing,我还以为是nexus组织下载.把type=bundle去掉可以下载,后来同事给了我这个连接https://issues.apache.org/ ...

  7. iOS播放gif图方式

    转发:http://www.cnblogs.com/jerehedu/ 图片分为静态和动态两种,图片的格式有很多种,在开发中比较常见的是.png和.jpg的静态图片,但有的时候在App中需要播放动态图 ...

  8. 多年心愿,终于完成,热泪盈眶啊。。。Adrew NG 的 机器学习

    谢谢Andrew老师!谢谢Coursera!谢谢自己!希望这是一个好的开始!希望自己也能使用机器学习来make a better world...  

  9. Runtime简介以及常见的使用场景(此内容非原创,为转载内容)

    Runtime简称运行时,是一套比较底层的纯C语言的API, 作为OC的核心,运行时是一种面向对象的编程语言的运行环境,其中最主要的是消息机制,Objective-C 就是基于运行时的. 所谓运行时, ...

  10. ArcEngine部分工作总结

    Arcengine工作总结地物点查询本部分可以在一个窗体中实现,也可以在两个窗体中实现.由于工作要求本人是在两个窗体中实现的:弹出窗体的名称为FormQuery主窗体单机查询时间的代码FormQuer ...