您的位置:首页 > 编程语言 > C语言/C++

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

2016-10-24 14:30 453 查看
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点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: