BMP文件格式,也被称为位图图像文件或与设备无关的位图文件格式(DIB)或者只是一个位图,是
一个光栅图形 图像文件格式使用
来存储位图,数字,图片,独立的显示设备。

微软已经定义了一个特定的表示颜色的位图 不同的颜色深度,作为援助交换设备和之间的位图 应用程序与各种各样的内部表示。
他们称这些 与设备无关的位图或权利,叫做DIB文件格式 文件格式或BMP图像文件格式。 根据微软的支持:

与设备无关的位图(DIB)是一种用于定义格式 与设备无关的位图在各种颜色的决议。 的主要目的 权利是允许从一个设备转移到另一个位图(因此, 与设备无关的名字)的一部分。 DIB外部格式,形成鲜明对比 设备相关的位图,在系统作为一个位图对象 应用程序创建的(……)。 元的DIB通常运输 (通常使用StretchDIBits()函数),BMP文件,剪贴板 (CF_DIB数据格式)。

BMP图片格式图:

接下来来看一个代码对BMP头的封装,然后将rgb888转化成rgb565的现象的例程:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

#define  RGB(r,g,b)    		(((r>>3)<<11)|((g>>2)<<5)|(b>>3))

typedef  unsigned char  U8 ;
typedef  unsigned short U16 ;
typedef  unsigned int   U32 ; 

#pragma  pack(1)
struct bmp_header    //这个结构体就是对上面那个图做一个封装。
{
	//bmp header
	U8  Signatue[2] ;   // B  M
	U32 FileSize ;     //文件大小
	U16 Reserv1 ;
	U16 Reserv2 ;
	U32 FileOffset ;   //文件头偏移量

	//DIB header
	U32 DIBHeaderSize ; //DIB头大小
	U32 ImageWidth   ;  //文件宽度
	U32 ImageHight   ;  //文件高度
	U16 Planes       ;
	U16 BPP          ;  //每个相素点的位数
	U32 Compression  ;
	U32 ImageSize    ;  //图文件大小
	U32 XPPM ;
	U32 YPPM ;
	U32 CCT ;
	U32 ICC ;
};
#pragma  pack()

int main(int argc , char **argv)
{
	//判断参数,传进来的参数不等于两个,那么就报错      ./a.out   xxx
	if(argc != 2)
		return -1 ; 

	int fd ;
	int dest_fd ;
	//以只读的方式打开一个文件  这个文件是rgb888
	fd = open(argv[1] , O_RDONLY);
	if(-1 == fd)
	{
		perror("open bmp file fail");
		return -2 ;
	}

	//打开一个rgb565.bmp的图片
	dest_fd = open("rgb565.bmp" , O_RDWR | O_CREAT|O_TRUNC , 0777);
	if(dest_fd < 0 )
	{
		perror("open rgb565 fail");
		return -3 ;
	}

	//定义一个bmp的头
	struct bmp_header  header ; 

	int ret ; 

	//读出bmp文件头的数据
	ret = read(fd , &header , sizeof(struct bmp_header));

	//以下是bmp图的相关数据
	printf(" Signatue[0]      : %c  \n " , header.Signatue[0]  );
	printf(" Signatue[1]      : %c  \n " , header.Signatue[1]  );
	printf(" FileSize         : %d  \n " , header.FileSize     );
	printf(" Reserv1          : %d  \n " , header.Reserv1      );
	printf(" Reserv2          : %d  \n " , header.Reserv2      );
	printf(" FileOffset       : %d  \n " , header.FileOffset   );
	printf(" DIBHeaderSize    : %d  \n " , header.DIBHeaderSize);
	printf(" ImageWidth       : %d  \n " , header.ImageWidth   );
	printf(" ImageHight       : %d  \n " , header.ImageHight   );
	printf(" Planes           : %d  \n " , header.Planes       );
	printf(" BPP              : %d  \n " , header.BPP          );
	printf(" Compression      : %d  \n " , header.Compression  );
	printf(" ImageSize        : %d  \n " , header.ImageSize    );
	printf(" XPPM             : %d  \n " , header.XPPM         );
	printf(" YPPM             : %d  \n " , header.YPPM         );
	printf(" CCT              : %d  \n " , header.CCT          );
	printf(" ICC              : %d  \n " , header.ICC          );

	char buffer[header.ImageSize] ; 

	read(fd , buffer , header.ImageSize);

	close(fd);

	//改变地方
	header.BPP = 16 ;
	header.FileSize = header.ImageWidth*header.ImageHight*2+54 ;
	header.ImageSize = header.ImageWidth*header.ImageHight*2;

	write(dest_fd , &header , sizeof(struct bmp_header));

	int row , col ;
	short data ;
	char *p = NULL ; 

	for(row = 0 ; row < header.ImageHight ; row++)
	{
		for(col = 0 ; col < header.ImageWidth ; col++)
		{
			p =( buffer+(row*header.ImageWidth + col)*3);
			data = RGB((unsigned char)(*(p+2)) , (unsigned char)(*(p+1)) ,
			(unsigned char )(*(p)));
			write(dest_fd , &data , 2);
		}
	}

	close(dest_fd);

	return 0 ;
}

接下来我们来对这幅图进行操作,看看打印出什么信息:这副图就是1.bmp----->格式rgb888

运行结果:获取到bmp图的包头,顺便将rgb888的bmp图转化为rgb565

生成rgb565的bmp图:是不是发现像素差了一点?

后续还会有bmp图相关的操作,例如BMP图旋转(左右转),bmp图的灰度处理

,欢迎继续关注Bruce.yang的嵌入式之旅

linu下C语言之BMP图片操作编程(上)的更多相关文章

  1. linu下C语言之BMP图片操作编程(下)

    前面提高了一个将BMP左转的程序,右转其实也是类似的操作,就不写了,这节,我们来实现,将一张BMP图进行灰度处理,代码贴上: #include <stdio.h> #include < ...

  2. linu下C语言之BMP图片操作编程(中)

    http://blog.csdn.net/morixinguan/article/details/50719472 关于BMP图的介绍之前已经说过了,最近要用到,又要重新开始学习. 现在实现一个让bm ...

  3. 【C】用C语言提取bmp图片像素,并进行K-means聚类分析——容易遇到的问题

    关于bmp图片的格式,网上有很多文章,具体可以参考百度百科,也有例子程序.这里只提要注意的问题. (1)结构体定义问题:首先按照百度百科介绍的定义了结构体,但是编译发现重定义BITMAPFILEHEA ...

  4. C语言实现BMP图片生成

    ## #include <stdio.h> #include <stdlib.h> #include <string.h> typedef unsigned cha ...

  5. JQuery,JS图片操作(上一张,下一张,旋转,放大,缩小)

    1.html代码:我是从数据库获取图片路径. <div id="divprint" align="center"> @{DataTable dt = ...

  6. .NET Core 图片操作在 Linux/Docker 下的坑

    一.前言 .NET Core 目前更新到2.2了,但是直到现在在 .NET Core 本身依然不包括和图片有关的 Image.Bitmap 等类型.对于图片的操作在我们开发中很常见,比如:生成验证码. ...

  7. 位图文件格式及linux下C语言来操作位图文件

    说到图片,位图(Bitmap)当然是最简单的,它是Windows显示图片的基本格式,其文件扩展名为*.BMP.由于没有经过任何的压缩,故BMP图片往往很大.在Windows下,任何格式的图片文件都要转 ...

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

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

  9. bmp图片的有关操作

    读取bmp图片 并生成新的bmp图片 #include "stdafx.h"#include <windows.h>#include <cmath>#inc ...

随机推荐

  1. Java安全管理器——SecurityManager

    总的来说,Java安全应该包括两方面的内容,一是Java平台(即是Java运行环境)的安全性:二是Java语言开发的应用程序的安全性.由于我们不是Java本身语言的制定开发者,所以第一个安全性不需要我 ...

  2. Apache DbUtils 探秘

    听说Apache的DbUtils很好用,而且是对jdbc的简单的封装,所以可以和jdbc一起混搭,多以今天就来尝试一下,关于DbUtils 是如何使用的. 准备 数据库: MySQL 依赖: mysq ...

  3. wget 常用参数释义

    wget 大法好啊,废话不多说,下面开始wget之旅吧. 下载限速 wget命令有一个内建的选项可以先顶下载任务占有的最大的带宽,从而保证其他应用程序的流畅运行. 具体使用--limit-rate 数 ...

  4. Nginx的负载均衡 - 最少连接 (least_conn)

    Nginx版本:1.9.1 我的博客:http://blog.csdn.net/zhangskd 算法介绍 我们知道轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同. 这有个前提,就是每个请 ...

  5. 剑指Offer——分治算法

    剑指Offer--分治算法 基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更 ...

  6. Android开发学习之路--RxAndroid之操作符

      学习了RxAndroid的一些基本知识,上篇文章也试过了RxAndroid的map操作符,接着来学习更多的操作符的功能吧.   操作符就是为了解决对Observable对象的变换的问题,操作符用于 ...

  7. ubuntu14.04 server ftp 服务安装配置详解

    ubuntu14.04 server ftp 服务安装配置详解 cheungmine 2016-01-27 http://wiki.ubuntu.com.cn/Vsftpd 0 安装好vsftpd服务 ...

  8. Xcode中Groups和Folder的区别

    以前一直没有在意这个问题,今天"中奖"了 ;( 在Xcode文件夹视图中会发现2种颜色的文件夹图标:黄色和蓝色. 黄色表示组(groups),蓝色表示文件夹(folder). 组只 ...

  9. react-native版本升级

    时刻将React Native更新到最新的版本,可以获得更多API.视图.开发者工具以及其他一些好东西(译注:官方开发任务繁重,人手紧缺,几乎不会对旧版本提供维护支持,所以即便更新可能带来一些兼容上的 ...

  10. 导航控制器&nbsp;UI_08(上)

    主要内容:UINavigationController 重要:属性传值(向后一个界面传值).代理传值(向前相邻的界面传值).单例传值(不相邻的界面向前传值) 1.UINavigationControl ...