BMP文件格式分析有很多,官方的资料已经通通涵盖在那份附件里了。这里具体些两个我遇到的问题...
No.1 BMP文件中低位在前。在读超过两个字节表示的数据时要格外小心一点:比如一个四字节的数据,共32位。这32位是一个整体,不能分成4个8位来看。以下是我的代码:
/**
* 读取位图文件中的数字型标签
* @param dins 数据输入流对象
* @param tagLen 该数字型标签的长度
* @return 位图文件中的数字型标签。读取异常则返回-1。
*/
private int readFileSize(java.io.DataInputStream dins, int tagLen){
int fileSize = 0;
try{
byte[][] size = new byte[tagLen][8];
//索引0->3,低位->高位。
for(int i=0; i<tagLen; i++){
byte s = dins.readByte();
if(s<0){
short ss = (short) (s + 256);
size[i] = myBitSet(ss);
}else{
size[i] = myBitSet(s);
}
for(int j=0; j<8; j++){
fileSize += size[i][j] * Math.pow(2, (i * 8 + j));
}
}
return fileSize;
}catch(Exception e){
e.printStackTrace();
return -1;
}
/**
* 有一个byte值得到一个byte数组
* @param b byte型值
* @return 按索引0->7,低位->高位
*/
private byte[] myBitSet(short b){
byte[] bs = new byte[8];
for(int i=0; i<8; i++){
bs[i] = (byte) (b%2);
b = (byte) (b/2);
}
return bs;
}
No.2 就是关于官方资料中不太明确的比特补满。这里只明确:它是在每一行的末尾如果出现不满足4的倍数时不上几个字节。我做的测试文件中,除四后的余数为3的,只需在每行末尾忽略一个字节;余数为1的...(我是没忽略什么也读过来了);目前还没找到余数为2的...