文件文件; //定义文件对象
_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;
版权声明: