📄 bmpreader.java
字号:
import java.io.IOException;
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;
public class BMPReader extends RandomAccessFile{
public static final int[] BMP_TYPE = new int[]{1,2,4,8,16,24,32};
public BMPReader(String fileName,String mode) throws Exception {
super(fileName,mode);
long fileLength = length();
if (fileLength < 0X28) {
throw new Exception("不是正确的BMP文件格式(没到达基本长度)");
}
}
public int readData(int offset, int byteSize) throws IOException {
int data = 0;
seek(offset);
for (int i=0; i<byteSize; i++) {
data += readUnsignedByte()<<8*i;
}
return data;
}
public int readData(int byteSize) throws IOException {
int data = 0;
for (int i=0; i<byteSize; i++) {
data += readUnsignedByte()<<8*i;
}
return data;
}
public int[] read4byteArray(int offset, int intSize) throws IOException {
int[] data = new int[intSize];
int bytes = 4;
seek(offset);
for (int i=0; i<data.length; i++) {
data[i] = readData(bytes);
}
return data;
}
protected boolean isBMPFile(int colorBits) {
boolean isBMP = false;
for (int i=0; i<BMP_TYPE.length; i++) {
if (colorBits == BMP_TYPE[i]) {
isBMP = true;
break;
}
}
return isBMP;
}
public int[][] readBMP(int offset, int width, int height, int bits) throws IOException, Exception {
if (!isBMPFile(bits)) {
throw new Exception("文件类型不匹配(有效类型位:1bit,2bit" +
",4bit,8bit,16bit,24bit,32bit)");
}
int[][] data = null;
switch(bits) {
case 1 : data = read1bitBMP(offset,width,height); break;
case 2 : data = read2bitBMP(offset,width,height); break;
case 4 : data = read4bitBMP(offset,width,height); break;
case 8 : data = read8bitBMP(offset,width,height); break;
case 16 : data = read16bitBMP(offset,width,height); break;
case 24 : data = read24bitBMP(offset,width,height); break;
case 32 : data = read32bitBMP(offset,width,height); break;
}
return data;
}
public int[][] read1bitBMP(int offset, int width, int height) throws IOException {
return null;
}
public int[][] read2bitBMP(int offset, int width, int height) throws IOException {
return null;
}
public int[][] read4bitBMP(int offset, int width, int height) throws IOException {
return null;
}
public int[][] read8bitBMP(int offset, int width, int height) throws IOException {
width = ((width+3)/4)*4;
int[][] data = new int[height][width];
seek(offset);
for (int i=height-1; i>-1; i--) {
for (int j=0; j<width; j++) {
data[i][j] = readUnsignedByte();
}
}
return data;
}
public int[][] read16bitBMP(int offset, int width, int height) throws IOException {
int[][] data = new int[height][width];
int oneData = 0;
seek(offset);
for (int i=height-1; i>-1; i--) {
for (int j=0; j<width; j++) {
}
}
return data;
}
public int[][] read24bitBMP(int offset, int width, int height) throws IOException {
width = ((width+3)/4)*4;
int[][] data = new int[height][width];
int bytes = 3;
seek(offset);
for (int i=height-1; i>-1; i--) {
for (int j=0; j<width; j++) {
data[i][j] = readData(bytes);
}
}
return data;
}
public int[][] read32bitBMP(int offset, int width, int height) throws IOException {
int[][] data = new int[height][width];
int oneData = 0;
int bytes = 4;
seek(offset);
for (int i=height-1; i>-1; i--) {
for (int j=0; j<width; j++) {
data[i][j] = readData(bytes);
}
}
return data;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -