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图片从本地读取 ...
随机推荐
- IE6下最小19px像素
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 新手常见的python报错及解决方案
此篇文章整理新手编写代码常见的一些错误,有些错误是粗心的错误,但对于新手而已,会折腾很长时间才搞定,所以在此总结下我遇到的一些问题.希望帮助到刚入门的朋友们.后续会不断补充. 目录 1.NameErr ...
- PHP :Call to undefined function mysql_connect()
今天配置apache ,php,mysql 的时候,一直报(Call to undefined function mysql_connect()),PHP一直连接不上数据库,从网上查,答案也都是千篇一 ...
- springMVC 静态文件 访问
1. 新建web project 2. 导入所需jar包 3. 更改web.xml <?xml version="1.0" encoding="UTF-8" ...
- locks
grep 'parking to wait for' gs2_jstack_141203.txt | uniq -c | sort -n查看哪个锁出现次数最多 http://blog.csdn.ne ...
- Delphi的指针(转)
源:http://blog.csdn.net/henreash/article/details/7368088 Pointers are like jumps, leading wildly from ...
- CodeForces 616A Comparing Two Long Integers
水题 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; +; ...
- 如何把程序钉到Windows7任务栏(修正版)
源:如何把程序钉到Windows7任务栏(修正版) 在CSDN论坛看到有网友提问如何把程序钉到Windows7的任务栏,ccrun(妖哥)对这个问题很感兴趣,于是google了一下,没有找到相关的AP ...
- flume-1.6.0单节点部署
这个不多说,直接上干货,部署很简单! 步骤一:flume的下载 当然,这里也可以使用wget命令在线下载,很简单,不多说. 步骤二:flume的上传 [hadoop@djt002 flume]$ ls ...
- HDU 4008 Parent and son
树形DP+LCA+思路.这题可真是有点难度......所以准备详细写一下题解. 题意:给一颗无根树,有Q次询问,每次询问指定一个根节点X,然后让你计算Y节点的儿子和子孙中,编号最小的节点是多少. 我们 ...