文件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. Ubuntu下安装Hudson

    因为hudson需要依赖java等,手动安装比较费劲 官方给出了一种很简单的解决方案:http://wiki.eclipse.org/Hudson-ci/Installing_Hudson_DEB 1 ...

  2. usb免驱动摄像头实验

    1.编译openwrt系统内核使它支持usb,进入在/openwrt/trunk上执行make menuconfig 2.1). 添加USB 相关支持Kernel modules —> USB ...

  3. android bitmap compress(图片压缩)

    android bitmap compress android的照相功能随着手机硬件的发展,变得越来越强大,能够找出很高分辨率的图片. 有些场景中,需要照相并且上传到服务,但是由于图片的大小太大,那么 ...

  4. 水流(water)

    水流(water) 题目描述 全球气候变暖,小镇A面临水灾,于是你必须买一些泵把水抽走.泵的抽水能力可以认为是无穷大,但你必须把泵放在合适的位置,从而能使所有的水能流到泵里.小镇可以认为是N×M的矩阵 ...

  5. hibernate--多对多双向关联(少用)

    老师知道自己教了哪些学生, 学生也知道教自己的有哪些老师. Teacher.java: package com.bjsxt.hibernate; import java.util.HashSet; i ...

  6. c语言基础编程

    作业: 1.二进制,八进制,十进制之间的相互转换 2.测试转义字符 3.测试强制类型转换 4.测试赋值运算符  = += -= *= /= %= <<= >>= ^= |= & ...

  7. ice grid 完整部署过程

    待补充 一 理论准备 一个IceGrid集群有一个registry(注册表,用于定位)和多个node组成. IceGrid配置包括集群配置和应用配置: config.grid是集群配置,配置Regis ...

  8. linux查看系统负载

    摘要:number of cores = max load , linux 系统负载高 如何检查? 1:load Average    1.1:什么是Load?什么是Load Average?    ...

  9. WINDOWS动态链接库--MFC规则动态链接库

    第一代window程序员使用windows api进行编程,到了后来,微软推出MFC类库,于是,动态链接库进行了升级,可以在动态连接库中使用MFC的API,这就叫做MFC动态链接库, 其中MFC动态链 ...

  10. octave之奇巧淫技向量化计算实现寻找样本点所属聚类下标

    前面有文章提到过,K-means算法,第一步骤是找出样本点的的所属聚类.下面用两种方式实现,一种是普通的循环,一种是完全向量化计算. 假设 : X 是m×n样本矩阵,其每一行是一个样本,m表示样本数目 ...