从img文件中读取180*120*4长度的字节数据(通过偏移量取),转换成16进制数字符串存放到xml文件中供提取,要求读取到这个16进制的字符串数据后转换成二进制就直接生成图片,但是img文件在生成的时候把头信息去掉了,无法直接读取,现在要添加上头信息才可以。现在是有ImageDate(16进制数字符串),没有BITMAPFILEHEADER和BITMAPINFOHEADER。位图大致构成:
1、位图文件头BITMAPFILEHEADER
2、位图信息头BITMAPINFOHEADER
3、调色板Palette
4、实际的位图数据ImageDate问题就是如何将头信息(文件头和信息头)加到16进制字符串前面,使得可以直接读取?结构体如何转换成16进制的字串??----C#中实现附:文件头和信息头结构体
文件头:
typedef struct tagBITMAPFILEHEADER {
WORD           bfType;
DWORD        bfSize;
WORD           bfReserved1;
WORD           bfReserved2;
DWORD         bfOffBits;
} BITMAPFILEHEADER;
这个结构的长度是固定的,为14个字节(WORD为无符号16位整数,DWORD为无符号32位整数),各个域的说明如下:
bfType
指定文件类型,必须是0x424D,即字符串“BM”,也就是说所有.bmp文件的头两个字节都是“BM”。
bfSize
指定文件大小,包括这14个字节。
bfReserved1,bfReserved2      
为保留字,不用考虑
bfOffBits
为从文件头到实际的位图数据的偏移字节数,即图1.3中前三个部分的长度之和。信息头BITMAPINFOHEADER,也是一个结构,其定义如下: 
typedef struct tagBITMAPINFOHEADER{
DWORD           biSize;
LONG            biWidth;
LONG            biHeight;
WORD            biPlanes;
WORD            biBitCount
DWORD           biCompression;
DWORD           biSizeImage;
LONG            biXPelsPerMeter;
LONG            biYPelsPerMeter;
DWORD           biClrUsed;
DWORD           biClrImportant;
} BITMAPINFOHEADER;
这个结构的长度是固定的,为40个字节(LONG为32位整数),各个域的说明如下:
biSize指定这个结构的长度,为40。
biWidth指定图象的宽度,单位是象素。
biHeight指定图象的高度,单位是象素。
biPlanes必须是1,不用考虑。
biBitCount 指定表示颜色时要用到的位数,常用的值为1(黑白二色图), 4(16色图), 8(256色), 24(真彩色图)(新的.bmp格式支持32位色)。
biCompression指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS(都是一些Windows定义好的常量)。要说明的是,Windows位图可以采用RLE4,和RLE8的压缩格式,但用的不多。我们今后所讨论的只有第一种不压缩的情况,即biCompression为BI_RGB的情况。
biSizeImage指定实际的位图数据占用的字节数,其实也可以从以下的公式中计算出来:biSizeImage=biWidth’ × biHeight
要注意的是:上述公式中的biWidth’必须是4的整倍数(所以不是biWidth,而是biWidth’,表示大于或等于biWidth的,最接近4的整倍数。举个例子,如果biWidth=240,则biWidth’=240;如果biWidth=241,biWidth’=244)。
如果biCompression为BI_RGB,则该项可能为零
biXPelsPerMeter指定目标设备的水平分辨率,单位是每米的象素个数,关于分辨率的概念,我们将在第4章详细介绍。
biYPelsPerMeter指定目标设备的垂直分辨率,单位同上。
biClrUsed指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为2biBitCount
biClrImportant指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。