文件处理
2015-12-13 15:44
190 查看
除了部分已有封装库的文件格式,在操作文件时最好根据文件的结构,将字节流对应到字符中或者像素中.
常见图像文件:
BMP即为bitmap.不对图像进行压缩,所以相对较大.
文件由文件头,位图信息头,颜色信息和图形数据组成.
文件格式
文件头格式(14字节)
BM标识2字节
文件大小(字节4字节
保留位2+2字节
像素数组的地址4字节
DIB头格式(根据操作系统的不同而不同)(之后基本都是124位
DIB头的大写(40字节
图片长宽像素大小
色彩平面数(为1时才有效/这是做什么鬼用(摔)
每个像素所占的位数
好了.其他的都暂时不是很重要....(其实我这种人读到0x000A(数组开始位置)的时候就已经不想继续了,然后想想好像还有像素宽高和像素所占位置才继续了.
之后就相对简单了,读入流里,读取头信息扔到对应的变量后就可以把头信息截掉,再根据字节和像素的关系直接操作数组就好.
对了,记得老师在用数组的时候好像不喜欢用二维数组,都是 int arr[w * h].
上文中左右的表格来自维基百科,截图来自,咳王老师.
读取txt文件.
public static BufferedReader readTxt (String filePath,String encoding) throws IOException{
File file = new File(filePath);
InputStreamReader read = null;
BufferedReader bReader = null;
try{
if(file.isFile() && file.exists()){
read = new InputStreamReader(new FileInputStream(file),encoding);
bReader = new BufferedReader(read);
String lineTxt = null;
while((lineTxt = bReader.readLine()) != null){
System.out.println(lineTxt);
}
} else
System.out.println("找不到指定文件");
} catch (IOException e) {
System.out.println("读取异常");
} finally{
read.close();
}
return bReader;
}
常见图像文件:
BMP即为bitmap.不对图像进行压缩,所以相对较大.
文件由文件头,位图信息头,颜色信息和图形数据组成.
结构体名称 | 可选 | 大小 | 用途 | 备注 |
---|---|---|---|---|
位图文件头 | 否 | 14字节 | 存储位图文件通用信息 | 仅在读取文件时有用 |
DIB头 | 否 | 固定(存在7种不同版本) | 存储位图详细信息及像素格式 | 紧接在位图文件头后 |
附加位掩码 | 是 | 3或4 DWORD(12或16字节) | 定义像素格式 | 仅在DIB头是BITMAPINFOHEADER时存在 |
调色板 | 见备注 | 可变 | 定义图像数据(像素数组)所用颜色 | 色深≤ 8时不能省略 |
填充区A | 是 | 可变 | 结构体对齐 | 位图文件头中像素数组偏移量的产物 |
像素数组 | 否 | 可变 | 定义实际的像素数值 | 像素数据在DIB头和附加位掩码中定义。像素数组中每行均以4字节对齐 |
填充区B | 是 | 可变 | 结构体对齐 | DIB头中ICC色彩特性数据偏移量的产物 |
ICC色彩特性数据 | 是 | 可变 | 定义色彩特性 | 可以包含外部文件路径,由该文件来定义色彩特性 |
偏移量 | 大小 | 用途 |
---|---|---|
0000h | 2字节 | 用于标识BMP和DIB文件的魔数,一般为0x42 0x4D,即ASCII的BM。以下为可能的取值: BM – Windows 3.1x, 95, NT, ... etc. BA – OS/2 struct Bitmap Array CI – OS/2 struct Color Icon CP – OS/2 const Color Pointer IC – OS/2 struct Icon PT – OS/2 Pointer |
0002h | 4字节 | BMP文件的大小(单位为字节) |
0006h | 2字节 | 保留;实际值因创建程序而异 |
0008h | 2字节 | 保留;实际值因创建程序而异 |
000Ah | 4字节 | 位图数据(像素数组)的地址偏移,也就是起始地址。 |
BM标识2字节
文件大小(字节4字节
保留位2+2字节
像素数组的地址4字节
偏移量 | 大小 | 用途 |
---|---|---|
0Eh | 4 | 该头结构的大小(40字节) |
12h | 4 | 位图宽度,单位为像素(有符号整数) |
16h | 4 | 位图高度,单位为像素(有符号整数) |
1Ah | 2 | 色彩平面数;只有1为有效值 |
1Ch | 2 | 每个像素所占位数,即图像的色深。典型值为1、4、8、16、24和32 |
1Eh | 4 | 所使用的压缩方法,可取值见下表。 |
22h | 4 | 图像大小。指原始位图数据的大小(详见后文),与文件大小不是同一个概念。 |
26h | 4 | 图像的横向分辨率,单位为像素每米(有符号整数) |
2Ah | 4 | 图像的纵向分辨率,单位为像素每米(有符号整数) |
2Eh | 4 | 调色板的颜色数,为0时表示颜色数为默认的2色深个 |
32h | 4 | 重要颜色数,为0时表示所有颜色都是重要的;通常不使用本项 |
DIB头的大写(40字节
图片长宽像素大小
色彩平面数(为1时才有效/这是做什么鬼用(摔)
每个像素所占的位数
好了.其他的都暂时不是很重要....(其实我这种人读到0x000A(数组开始位置)的时候就已经不想继续了,然后想想好像还有像素宽高和像素所占位置才继续了.
之后就相对简单了,读入流里,读取头信息扔到对应的变量后就可以把头信息截掉,再根据字节和像素的关系直接操作数组就好.
对了,记得老师在用数组的时候好像不喜欢用二维数组,都是 int arr[w * h].
上文中左右的表格来自维基百科,截图来自,咳王老师.
读取txt文件.
public static BufferedReader readTxt (String filePath,String encoding) throws IOException{
File file = new File(filePath);
InputStreamReader read = null;
BufferedReader bReader = null;
try{
if(file.isFile() && file.exists()){
read = new InputStreamReader(new FileInputStream(file),encoding);
bReader = new BufferedReader(read);
String lineTxt = null;
while((lineTxt = bReader.readLine()) != null){
System.out.println(lineTxt);
}
} else
System.out.println("找不到指定文件");
} catch (IOException e) {
System.out.println("读取异常");
} finally{
read.close();
}
return bReader;
}
相关文章推荐
- Android View的onTouchEvent和OnTouch区别
- android-Best Practices for Web Apps
- go build命令
- 数据中心备份技术资料汇总
- 创建型模式
- window[ "eval" ].call( window, data ); 语法错误
- 手Q支付(QQ钱包)
- pat 1003. Emergency (25)
- 数组和字符串
- 凸优化中的数学(二)范数,距离,单位球
- RaspBerry使用--windows环境下
- 关于字符,字符串,char和string
- jquery中toggle() 方法
- JQuery中的AJAX
- AJAX--接收服务器端的响应数据
- 【跟着大磨马学IT编程(安卓Java程序员)】第十四天 课程内容概述
- 【LeetCode】8 String to Integer(atoi)
- 深度分析Java的ClassLoader机制(源码级别)
- 围圈报数踢三游戏
- File类讲解