C++生成Bmp图片底层代码

C++生成Bmp图片底层代码

 

#include <pshpack2.h>
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

typedef long BOOL;
typedef long LONG;
typedef unsigned char BYTE;
typedef unsigned long DWORD;
typedef unsigned short WORD;

//位图文件头文件定义
//其中不包括文件类型信息(由于结构体的内存结构决定,要是加了的话将不能正确的读取文件信息)
typedef struct {
	WORD    bfType;//文件类型,必须是0x424D,即字符“BM”
	DWORD   bfSize;//文件大小
	WORD    bfReserved1;//保留字
	WORD    bfReserved2;//保留字
	DWORD   bfOffBits;//从文件头到实际位图数据的偏移字节数
} BMPFILEHEADER_T;

struct BMPFILEHEADER_S{
	WORD    bfType;
	DWORD   bfSize;
	WORD    bfReserved1;
	WORD    bfReserved2;
	DWORD   bfOffBits;
};
typedef struct{
	DWORD      biSize;//信息头大小
	LONG       biWidth;//图像宽度
	LONG       biHeight;//图像高度
	WORD       biPlanes;//位平面数,必须为1
	WORD       biBitCount;//每像素位数
	DWORD      biCompression;//压缩类型
	DWORD      biSizeImage;//压缩图像大小字节数
	LONG       biXPelsPerMeter;//水平分辨率
	LONG       biYPelsPerMeter;//垂直分辨率
	DWORD      biClrUsed;//位图实际用到的色彩数
	DWORD      biClrImportant;//本位图中重要的色彩数
} BMPINFOHEADER_T;//位图信息头定义

void generateBmp( BYTE * pData, int width, int height,  char * filename )//生成Bmp图片,传递RGB值,传递图片像素大小,传递图片存储路径
{
	int size = width*height*3; // 每个像素点3个字节
	// 位图第一部分,文件信息
	BMPFILEHEADER_T bfh;
	bfh.bfType = 0X4d42;  //bm
	bfh.bfSize = size  // data size
		+ sizeof( BMPFILEHEADER_T ) // first section size
		+ sizeof( BMPINFOHEADER_T ) // second section size
		;
	bfh.bfReserved1 = 0; // reserved
	bfh.bfReserved2 = 0; // reserved
	bfh.bfOffBits = bfh.bfSize - size;

	// 位图第二部分,数据信息
	BMPINFOHEADER_T bih;
	bih.biSize = sizeof(BMPINFOHEADER_T);
	bih.biWidth = width;
	bih.biHeight = height;
	bih.biPlanes = 1;
	bih.biBitCount = 24;
	bih.biCompression = 0;
	bih.biSizeImage = size;
	bih.biXPelsPerMeter = 0;
	bih.biYPelsPerMeter = 0;
	bih.biClrUsed = 0;
	bih.biClrImportant = 0;      
	FILE * fp = fopen( filename,"wb" );
	if( !fp ) return;
	fwrite( &bfh, 1, sizeof(BMPFILEHEADER_T), fp );
	fwrite( &bih, 1, sizeof(BMPINFOHEADER_T), fp );
	fwrite( pData, 1, size, fp );
	fclose( fp );
}
void main()
{
	int i=0, j=0;
	struct {
		BYTE b;
		BYTE g;
		BYTE r;
	} pRGB[240][320];  // 定义位图数据
	memset( pRGB, 0, sizeof(pRGB) ); // 设置背景为黑色
	// 在中间画一个100*100的矩形
	for(  i=70;i<170;i++ ){
		for( j=110;j<210;j++ ){
		//	pRGB[i][j].r = 0xff;
			pRGB[i][j].r=0xff;
			pRGB[i][j].g=0xff;
			pRGB[i][j].b=0xff;
		}
	}
	// 生成BMP图片
	generateBmp( ( BYTE*)pRGB, 320, 240, "E:\\rgb.bmp" );
}


上述代码生成一个320*240像素的图片,背景色为黑色,中间画了一个白色的矩形

 

 

更新于2017年7月7日:刚刚有网友说为什么将照片大小设置为500*500或者是更大的尺寸就不可以了,因为随着静态数据的增加所需要的堆栈保留大小就会增加,而VS中默认保留的是1M,所以程序尚未运行就会出现堆栈溢出错误,解决方法参考一下以下的博文:VS2010运行错误:0x010e86c7 处有未经处理的异常: 0xC00000FD: Stack overflow - yangliuqing19的博客 - CSDN博客  http://blog.csdn.net/yangliuqing19/article/details/51568731点击打开链接

 

如果您觉得这篇博文有用,请访问我的个人站:http://www.stubbornhuang.com,更多博文干货等着您。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HW140701

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值