BMP文件
BMP文件结构分为三个部分:文件头(54字节)、调色板数据和图像数据。
24位色图像中没有调色板数据部分。
文件头结构:
struct {
WORD Type; //BMP文件标志,为“BM”
DWORD Size; //文件大小
WORD Reserved1; //保留
WORD Reserved2; //保留
DWORD Offset; //图像数据对文件头的偏移
DWORD SizeStruct; //BMP文件头中一结构大小,为40
DWORD Width; //图像宽度
DWORD Height; //图像高度
WORD Planes; //设备的平面数,为1
WORD BitCount; //像素位数
DWORD Compression; //压缩类型,24位无法压缩
DWORD SizeImage; //图像数据大小
DWORD XPeIsPerMeter; //分辨率
DWORD YPeIsPerMeter; //分辨率
DWORD ClrUsed; //使用了多少种颜色(调色板中)
DWORD ClrImportant; //重要颜色的变址数,若都是重要颜色取0值
}BMPHEAD;
调色板结构:
struct {
BYTE Blue;
BYTE Green;
BYTE Red;
BYTE Reserved; //保留,为0
}RGBQUAD;
注意:
一、WINDOWS BMP文件规定每行像素字节数必须是4的倍数,否则在像素数据后加若干字节(0),凑足4的倍数。
二、24位文件的图像数据中也是按BLUE、GREEN、RED的顺序来排的。
三、BMP文件的原点在左下角。
四、关于RLE压缩法在PCX中再详谈。
PCX文件
PCX文件也大致分为三个部分,分别是128字节的文件头部分、数据部分和调色板部分,和BMP文件很像,但所有的PCX都经过了RLE压缩,而且都是RLE8(按字节来压缩)。
文件头:
struct{
BYTE Type; //标志,为0X0A
BYTE Version; //版本号,最好为5
BYTE Encoding; //压缩方式,为1
BYTE BitsPerPixel;
int MinX,MinY; //X、Y坐标的MIN值
int MaxX,MaxY; //X、Y坐标的MAX值
int Hres,Vres; //分辨率
BYTE Palette[48]; //16色用调色板
BYTE Reserved; //保留
BYTE ColorPlanes;
WORD BitsPerLine; //一行数据所占用的字节数
WORD PaletteType; //调色板类型,1代表灰度,2代表彩色
BYTE Filler[58]; //保留
}PCXHEAD;
调色板:
若文件的倒数第769字节为0X0C,则代表文件是256色模式,而此后的768字节都是调色板数据。PCX文件的调色板数据是按RED、GREEN、BLUE的顺序来储存的。
RLE8压缩:
只要发现一串连续相同数据(以字节为单位),就用两个字节来替代它们;其中,第一个字节是这一串数据的长度,第二个字节代表这串数据的值;这就是RLE8的算法。
PCX在处理第一个字节时,还必须将它的高两位置1,用其余的六位来表示相同数据个数,因此其最大值只能为63。如果连续相同的数据大于63时,就必须用多字节来处理。而在图像数据大于等于0XC0时,即使是不连续出现的数据,也必须要分两个字节来表示该图像数据。
例:
压缩前——11个 0X15、0X5A、0X67、81个 0X35、0XC7、5个 0XD8
压缩后——0XCB、0X15、0X5A、0X67、0XFF、0X35、0XD2、0X35、0XC1、0XC7、0XC5、0XD8