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,更多博文干货等着您。