文件文件; //定义文件对象

_asserte(file.open ) cstring(e:((94.BMP )、CFile:modeRead ); //打开文件

DWORD dwLen=file.GetLength (; 获取//文件的长度

file.seek(54,CFile:begin; //跳过位图文件的标头、标头,向下看为什么是54

buffer=new BYTE[dwLen – 54]; //为缓冲区分配空间

file.read(buffer,dwLen – 54 );

//)整个位图由文件头部、头部、调色板和颜色表四个的组合构成

泰普德夫龙龙;

类型无符号长dword;

类型无符号短word;

#由于#pragmapack(push,1 )//4字节的对齐,因此标头大小为54字节,第一部分为14字节。

//第2部分为40字节,所以将第1部分补充为16自身,直接用sizeof打开图像

//遇到文件结尾编码错误

typedef struct {//位图文件的标头,14字节

word BF类型; 要指定//文件类型,0x424D (字符串“BM”,即所有. bmp文件的前两个字节必须为“BM”)。

DWORD bfSize; //位图文件的大小。 包括这14个字节,以字节为单位

WORD bfReserved1; //位图文件的保留字。 必须为0

WORD bfReserved2; //位图文件的保留字。 必须为0

DWORD bfOffBits; //位图数据的开头位置由文件头部相对于位图的偏移表示,并以字节为单位表示

} BMP文件header _ t;

# pragma包(pop ) )。

名为typedef struct{//的结构体的长度固定为40字节,请自己计算一下。 DWORD、LONG4为4字节,WORD为2字节

DWORD biSize; //指定此结构的长度,使其为40

龙比宽; //以像素为单位指定图像的宽度。

龙比海; //指定图像的高度。 单位是像素。

WORD biPlanes; 必须是//1,不用想。

word bi比特计数; /*指定表示颜色时使用的位数。 通常的值为1 (黑白双色图)、4 ) 16色图)。

8 ) 256色)、24 (真彩色)色图)新的. bmp格式支持32位颜色,但在此不讨论。 */

DWORD biCompression; /*指定是否压缩位图。 有效值为BI_RGB、BI_RLE8、BI_RLE4。

BI_BITFIELDS (都是几个Windows定义的常量。 说明一下,

Windows位图可以采用RLE4和RLE8压缩格式,但很少使用。

今后只考虑第一种未压缩的情况,即biCompression为BI_RGB的情况。 */

DWORD biSizeImage; /*指定实际位图数据占用的字节数,但实际上也可以通过以下公式计算:

bisizeimage=bi width’biheight

应注意,上述表达式中的bi width’必须是4的整数倍(例如

表示biWidth以上、最接近4的整数倍。 例如,在biWidth=240的情况下,bi width’=240;

如果biWidth=241,bi width’=244 )。 如果biCompression为BI_RGB,则此项目为零*/

LONG biXPelsPerMeter; //指定目标设备的水平分辨率(以每米像素为单位)

LONG biYPelsPerMeter; //指定目标设备的垂直分辨率,单位相同。

DWORD biClrUsed; //指定在本图像中实际使用的颜色数,如果该值为零,则使用的颜色数为2的biBitCount指数的幂

DWORD biClrImportant; //在本图像中指定重要的颜色数,如果其值为零,则认为所有的颜色都很重要。

} BMPINFOHEADER_T;

char * bmp_file=’fuck you.bmp ‘; //要保存的bmp文件名不要忘记后缀

//int width=cx.GetWidth (; 图像高度,已知

//int height=cx.GetHeight (;

int datalen=width * height *3* sizeof (char );//每1个像素3字节

//_asserte(L==size );

//位图的第一部分,文件信息

BMP文件header _ t bfh;

intdw=sizeof(dword );

intww=sizeof(word;

int kk=sizeof (BMP文件头_ t ); //14,不齐全就能得到16。 这样做的BMP打不开

intnn=sizeof(bmpinfoheader_t );//第二阶段大小

bfh.bfType=(WORD )0x4d42; //bm

bfh.bfSize=datalen kk nn;

bfh.bfReserved1=0;//保留

bfh.bfReserved2=0;//保留

bfh.bfoffbits=sizeof (BMP文件头_ t ) sizeof (bmpinfoheader _ t ); //真正的数据位置

//位图第2部分,数据信息

BMPINFOHEADER_T bih;

BIH.bi size=sizeof (bmpinfoheader _ t );

bih.biWidth=width;

bih.biHeight=height; //得到的RGB数据可以从位图的最后一点被扫描,得到的图像可以被颠倒地写入。 在这种情况下,使用-height会使图像正确

bih.biPlanes=1; //1,没有必要改变

bih.biBitCount=24;

bih.biCompression=0; //不压缩

bih.biSizeImage=datalen;

bih.biXPelsPerMeter=0; //2835;//每米像素

bih.biYPelsPerMeter=0; //2835;

bih.biClrUsed=0; //使用过的颜色,24位的为0

bih.biClrImportant=0; //每个像素都很重要

file*FP=fopen(BMP_file,’ wb ‘; 创建//BMP文件

if (! fp )

返回- 1;

fwrite(bfh、8、1、fp ); 在linux上4字节齐全,但头大小为54字节,第一部分为14字节,第二部分为40字节,所以将第一部分补充为16自身,直接使用sizeof。 打开图像时,会遇到文件结尾编码错误

write(bfh.BFreserved2,sizeof ) bfh.BFreserved2),1,fp );

frite(bfh.bfoffbits,sizeof ) bfh.bfoffbits ),1,fp );

写入(BIH,sizeof ) bmpinfoheader_t ),1,fp );

写入//RGB数据

write (缓冲器,数据,1,fp );

流量(FP );

delete[]buffer;

版权声明: