文件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系统如何卸载并安装新版本的jdk(permission denied问题)

    1.如果是自带的openjdk运行下面可以删除: sudo apt-get purge openjdk* 但是这种情况又不一定成功,有时候运行java -version发现还是可以运行的.证明删除不成 ...

  2. vmware中网络连接方式介绍

  3. DWR整合之JSF

    DWR 与 JSF DWR 包括两个 JSF 的扩展点,一个创造器和一个 ServletFilter. 1.JSF Creator DWR1.1 中有一个体验版的 JsfCreator.你可以在 dw ...

  4. 我的第一个Android项目之环境搭建

    开发IDE Android Studio2.0 + Genymotion + JDK1.8 网盘地址:http://pan.baidu.com/s/1kUSVqaN Android Studio 我的 ...

  5. HDU 5522 Numbers

    水题 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> us ...

  6. ckeditor_3.6.6.2+CKFinder2.0.2配置

    一.首先工具的下载,找到相应的版本进行下载     ckeditor_3.6.6.2+CKFinder2.0.2 http://ckeditor.com/download      打开war文件,然 ...

  7. HDU 5616 Jam's balance

    背包.dp[i]=1表示i这种差值能被组合出来,差值有负数,所以用sum表示0,0表示-sum,2*sum表示sum. 询问X的时候,只需看dp[sum+X]或者dp[sum-X]是否有一个为1,注意 ...

  8. (中等) HDU 4069 Squiggly Sudoku , DLX+精确覆盖。

    Description Today we play a squiggly sudoku, The objective is to fill a 9*9 grid with digits so that ...

  9. FZU 2091 播放器

    简单模拟题,开个栈维护一下即可. #include<cstdio> #include<cstring> #include<cmath> #include<st ...

  10. 《javascript语言精粹》——第4章函数

    函数就是对象 [1].函数字面量即(函数表达式)包括四部分: 第一部分:保留字function: 第二部分:函数名称,可有可无: 第三部分:包围在一对小括号的一组参数,参数用逗号隔开: 第四部分:包围 ...