- 浏览: 21425 次
- 性别:
- 来自: 信阳
-
最新评论
-
Mybeautiful:
协议无处不在,当我跟你说“你收到我邮件后,立刻回一封。”这就是 ...
协议论 -
jcs130:
哈哈~顶~~
2011年 暑假集训(7.22~8.22)
一、 介绍
开始之前先讲一下原始数据读写流DataOutputStream和DataInputStream
主要用来读写指定的数据类型的数据。两种数据流都以对应的文件输入
输出流为构造参数:
下面是几个数据输出流的几个方法(来至API):
writeBoolean(boolean v)
将一个 boolean
值以 1-byte 值形式写入基础输出流。
writeByte(int v)
将一个 byte 值以 1-byte 值形式写出到基础输出流中
writeChar(int v)
将一个 char 值以 2-byte 值形式写入基础输出流中,先写入高字节。
writeLong(long v)
将一个 long 值以 8-byte 值形式写入基础输出流中,先写入高字节。
以上都在数据输出流里有对应的方法,而且我们在读取数据时必须循序读取,而且类型要匹配,文件在存储数据时,是以byte形式储存的,例如,一个int 类型的数据,储存时会被拆成四个字节然后按高位到低位进行储存,所以在读取数据时必须匹配,不然会有数据丢失,储存时也是如此。
二、解析BMP文件格式:
任何文件在储存时都有自己的文件格式,而且这并不取决于扩展名,例如BMP文件,在储存时不仅包含画板上获取的数据,在储存是要提前写入一些文件头信息。
BMP文件有四部分组成:
1、 位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;
2、 位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及自定义颜色等信息;
3、 调色板:这个部分是可选的,有些位图需要调色板,有些位 图,比如我做的24位真彩图就不需要调色板
4、 位图数据:这部分根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。
三、 实现
实现主要分为两个部分,写入和读取,必须得按照BMP本身格式类型进行操作
写入:
/**
*
* @param image:截取的图片
* @param file:要存储的文件
*/
public void saveBMP(BufferedImage image,File file) {
try {
/* 创建文件输出流 */
java.io.FileOutputStream fos = new FileOutputStream(file);
/* 文件数据输出流 */
java.io.DataOutputStream dos = new DataOutputStream(fos);
//////////////////////////////////////////////*BMP文件头*/
int width = image.getWidth();
int height = image.getHeight();
/* 位图文件类型,2个字节 */
dos.writeByte((int) 'B');
dos.writeByte((int) 'M');
/* 位图文件大小,4个字节 */
int skip_width = 0;
/* Windows规定一个扫描行所占的字节数必须为4的倍数,不足的以0补上*/
if (width * 3 % 4 != 0)
skip_width = 4 - width * 3 % 4;
int bfsize = 54 + (width + skip_width) * 3 * height;
dos.write(changeIntTobyte(bfsize, 4), 0, 4);
/* 文件的两个保留字,4个 */
dos.write(changeIntTobyte(0, 4), 0, 4);
/* 起始位置4个字节 */
dos.write(54);
dos.write(changeIntTobyte(0, 3), 0, 3);
// ////////////////////////////////////////////*位图信息图*/
/* 本结构所占字节数40,4个字节 */
int size = 40;
dos.write(changeIntTobyte(size, 4), 0, 4);
/* 宽度,高度,8个字节 */
dos.write(changeIntTobyte(width, 4), 0, 4);
dos.write(changeIntTobyte(height, 4), 0, 4);
/* 目标设备 */
dos.write(changeIntTobyte(1, 2), 0, 2);
/* 像素所需位数 24*/
dos.write(changeIntTobyte(24, 2), 0, 2);
/* 压缩类型 */
dos.write(changeIntTobyte(0, 4), 0, 4);
/* 位图大小 */
dos.write(changeIntTobyte(0, 4), 0, 4);
/* 水平,垂直分辨率 */
dos.write(changeIntTobyte(150, 4), 0, 4);
dos.write(changeIntTobyte(150, 4), 0, 4);
/* 位图实际使用的颜色表,的颜色数 */
int numcolor = 0;
dos.write(changeIntTobyte(numcolor, 4), 0, 4);
/* 重要的颜色 */
int impcolor = 0;
dos.write(changeIntTobyte(impcolor, 4), 0, 4);
// ///////////////////////////////////////////位图数据
int color[][] = new int[height][width];
byte imageR[][] = new byte[height][width];
byte imageG[][] = new byte[height][width];
byte imageB[][] = new byte[height][width];
for (int h = 0; h < height; h++) {
for (int w = 0; w < width; w++) {
int temp = image.getRGB(w, h);
color[h][w] = temp;
imageR[h][w] = (byte)( temp >> 16);
imageG[h][w] = (byte)( temp >> 8);
imageB[h][w] = (byte)( temp >> 0);
}
}
for(int h= height - 1;h>-1;h--)
for(int w =0 ;w<width;w++){
dos.writeByte(imageB[h][w]);
dos.writeByte(imageG[h][w]);
dos.writeByte(imageR[h][w]);
if(skip_width!=0&&w == 0){
dos.write(changeIntTobyte(0,skip_width),0,skip_width);
}
}
fos.flush();
fos.close();
} catch (IOException exception) {
exception.printStackTrace();
}
}
以上还有一点比较重要,前面我们已经知道文件存储数据是以byte形式,从高位到低位存储的,但对于位图文件有点特殊,它是从低位到高位存储的,所以我在存储时要手动把数据转成byte型并以从低位到高位存入文件中,系统将会读取错误
public byte[] changeIntTobyte(int num, int size) { byte[] count = new byte[size]; for (int i = 0; i < size; i++) { count[i] = (byte) (num >> (i * 8)); } return count; }
对于读取只是按照以上步骤读取即可,记住一点,要把读入的数据再按位组合成所需要的数据,即使以上转化的逆过程。通过以上的过程就可以把画图板图片保存成BMP文件了,而且可以用windows 的图片查看了。不过只限于24位的欧。
四、 文件选择器的使用
以上已经实现了功能,下面是一点拓展,在实现存储和打开文件时我使用了文件选择器
public void saveFile() { try{ FileFilter filter1 = new FileFilter() { public boolean accept(File file) {// 只显示 bmp 格式的文件或文件夹 String formatName = file.getName().toLowerCase(); return formatName.endsWith(".bmp") || file.isDirectory(); } @Override public String getDescription() {// 文件描述为 bmp // TODO Auto-generated method stub return "bmp"; } }; JFileChooser jfc = new JFileChooser();// 文件选择器 jfc.setAcceptAllFileFilterUsed(false);// 不显示所有文件 jfc.setName("保存");// 标题 jfc.addChoosableFileFilter(filter1);// 加上过滤器 jfc.setCurrentDirectory(new File("src\\MyBMP\\images"));// 文件选择器的初始目录 File outfile;//用来获得文件 int state = jfc.showSaveDialog(drawPanel);// 此句是打开文件选择器界面的触发语句 if (state == 1) { return;// 撤销则返回 } else { outfile = jfc.getSelectedFile();// f为选择到的文件名 } /* 判断是否以bmp为后缀名,不管大小 */ String formatName = "bmp";// 指定为bmp String filename = outfile.getAbsolutePath().toLowerCase();// 获得路径 if (!filename.endsWith(formatName))// 如果输入时未加上后缀则自动加上后缀 outfile = new File(filename + "." + formatName); //自定义函数 saveBMP(image, outfile); //系统函数, //javax.imageio.ImageIO.write(image, formatName, outfile); } catch (java.awt.AWTException exception) { exception.printStackTrace(); } }
加上文件选择器就可以动态写文件名了,省的一直对一个文件进行操作,也变得更人性化了,这就是我的真正BMP。。。敬请指正。。
发表评论
-
略谈Hash
2011-11-25 03:07 1234... -
协议论
2011-09-29 01:49 1041一、引文 “协议”, ... -
哈弗曼树以及压缩运用
2011-08-14 16:56 1642一.介绍 其实在还没有学习压缩之前,在学校学习中已 ... -
树与二叉树
2011-08-12 22:34 818一、介绍 对于java中“树”这个概念,顾名思义就像是现实中 ... -
链表 小结
2011-08-09 21:29 725... -
星雨——项目总结
2011-08-07 16:25 868一、项目主类: 1.Ball(子弹);2.Ba ... -
多线程 小结
2011-08-01 22:28 862一. 介绍 每个java程序都至少有一 ... -
String 小结
2011-08-01 22:27 830一.String 类是一个比较相当重要的类,像网络上很多数据 ... -
异常机制 小结
2011-07-26 17:07 714异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制 ... -
文件操作小结
2011-07-26 16:46 742系统中的文件可分为三种:目录文件、真实文件、缓存文件。j ... -
KeyWords Summary
2011-07-25 00:21 819... -
集合框架 小结
2011-07-24 23:30 686Java 中集合类定义主要 ... -
事件和监听器的使用
2011-07-23 22:58 7691 .事件其实无处不在,每个人不管是在干什么,都是事件,在类里 ... -
类与对象
2011-06-09 23:42 409 类是对象的抽象化,也就相当于与一种类型eg:int,dou ... -
登陆界面开发
2011-06-09 23:41 7121. Eclipse的简单操作 Alt+’/’ 方法提示符 ... -
方法的重载与重写,自动转型与强制转型,多态的理解
2011-06-09 01:51 10161.方法的重载与重写? 两者都是对于函数的操作,区别在于重载是 ... -
类,抽象类,接口的特点,区别
2011-06-09 01:49 722类,抽象类,接口的特点,区别 /////////////// ...
相关推荐
内容概要:本文详细介绍了基于MATLAB GUI界面和卷积神经网络(CNN)的模糊车牌识别系统。该系统旨在解决现实中车牌因模糊不清导致识别困难的问题。文中阐述了整个流程的关键步骤,包括图像的模糊还原、灰度化、阈值化、边缘检测、孔洞填充、形态学操作、滤波操作、车牌定位、字符分割以及最终的字符识别。通过使用维纳滤波或最小二乘法约束滤波进行模糊还原,再利用CNN的强大特征提取能力完成字符分类。此外,还特别强调了MATLAB GUI界面的设计,使得用户能直观便捷地操作整个系统。 适合人群:对图像处理和深度学习感兴趣的科研人员、高校学生及从事相关领域的工程师。 使用场景及目标:适用于交通管理、智能停车场等领域,用于提升车牌识别的准确性和效率,特别是在面对模糊车牌时的表现。 其他说明:文中提供了部分关键代码片段作为参考,并对实验结果进行了详细的分析,展示了系统在不同环境下的表现情况及其潜在的应用前景。
嵌入式八股文面试题库资料知识宝典-计算机专业试题.zip
嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_3.zip
内容概要:本文深入探讨了一款额定功率为4kW的开关磁阻电机,详细介绍了其性能参数如额定功率、转速、效率、输出转矩和脉动率等。同时,文章还展示了利用RMxprt、Maxwell 2D和3D模型对该电机进行仿真的方法和技术,通过外电路分析进一步研究其电气性能和动态响应特性。最后,文章提供了基于RMxprt模型的MATLAB仿真代码示例,帮助读者理解电机的工作原理及其性能特点。 适合人群:从事电机设计、工业自动化领域的工程师和技术人员,尤其是对开关磁阻电机感兴趣的科研工作者。 使用场景及目标:适用于希望深入了解开关磁阻电机特性和建模技术的研究人员,在新产品开发或现有产品改进时作为参考资料。 其他说明:文中提供的代码示例仅用于演示目的,实际操作时需根据所用软件的具体情况进行适当修改。
少儿编程scratch项目源代码文件案例素材-剑客冲刺.zip
少儿编程scratch项目源代码文件案例素材-几何冲刺 转瞬即逝.zip
内容概要:本文详细介绍了基于PID控制器的四象限直流电机速度驱动控制系统仿真模型及其永磁直流电机(PMDC)转速控制模型。首先阐述了PID控制器的工作原理,即通过对系统误差的比例、积分和微分运算来调整电机的驱动信号,从而实现转速的精确控制。接着讨论了如何利用PID控制器使有刷PMDC电机在四个象限中精确跟踪参考速度,并展示了仿真模型在应对快速负载扰动时的有效性和稳定性。最后,提供了Simulink仿真模型和详细的Word模型说明文档,帮助读者理解和调整PID控制器参数,以达到最佳控制效果。 适合人群:从事电力电子与电机控制领域的研究人员和技术人员,尤其是对四象限直流电机速度驱动控制系统感兴趣的读者。 使用场景及目标:适用于需要深入了解和掌握四象限直流电机速度驱动控制系统设计与实现的研究人员和技术人员。目标是在实际项目中能够运用PID控制器实现电机转速的精确控制,并提高系统的稳定性和抗干扰能力。 其他说明:文中引用了多篇相关领域的权威文献,确保了理论依据的可靠性和实用性。此外,提供的Simulink模型和Word文档有助于读者更好地理解和实践所介绍的内容。
嵌入式八股文面试题库资料知识宝典-2013年海康威视校园招聘嵌入式开发笔试题.zip
少儿编程scratch项目源代码文件案例素材-驾驶通关.zip
小区开放对周边道路通行能力影响的研究.pdf
内容概要:本文探讨了冷链物流车辆路径优化问题,特别是如何通过NSGA-2遗传算法和软硬时间窗策略来实现高效、环保和高客户满意度的路径规划。文中介绍了冷链物流的特点及其重要性,提出了软时间窗概念,允许一定的配送时间弹性,同时考虑碳排放成本,以达到绿色物流的目的。此外,还讨论了如何将客户满意度作为路径优化的重要评价标准之一。最后,通过一段简化的Python代码展示了遗传算法的应用。 适合人群:从事物流管理、冷链物流运营的专业人士,以及对遗传算法和路径优化感兴趣的科研人员和技术开发者。 使用场景及目标:适用于冷链物流企业,旨在优化配送路线,降低运营成本,减少碳排放,提升客户满意度。目标是帮助企业实现绿色、高效的物流配送系统。 其他说明:文中提供的代码仅为示意,实际应用需根据具体情况调整参数设置和模型构建。
少儿编程scratch项目源代码文件案例素材-恐怖矿井.zip
内容概要:本文详细介绍了基于STM32F030的无刷电机控制方案,重点在于高压FOC(磁场定向控制)技术和滑膜无感FOC的应用。该方案实现了过载、过欠压、堵转等多种保护机制,并提供了完整的源码、原理图和PCB设计。文中展示了关键代码片段,如滑膜观测器和电流环处理,以及保护机制的具体实现方法。此外,还提到了方案的移植要点和实际测试效果,确保系统的稳定性和高效性。 适合人群:嵌入式系统开发者、电机控制系统工程师、硬件工程师。 使用场景及目标:适用于需要高性能无刷电机控制的应用场景,如工业自动化设备、无人机、电动工具等。目标是提供一种成熟的、经过验证的无刷电机控制方案,帮助开发者快速实现并优化电机控制性能。 其他说明:提供的资料包括详细的原理图、PCB设计文件、源码及测试视频,方便开发者进行学习和应用。
基于有限体积法Godunov格式的管道泄漏检测模型研究.pdf
嵌入式八股文面试题库资料知识宝典-CC++笔试题-深圳有为(2019.2.28)1.zip
少儿编程scratch项目源代码文件案例素材-几何冲刺 V1.5.zip
Android系统开发_Linux内核配置_USB-HID设备模拟_通过root权限将Android设备转换为全功能USB键盘的项目实现_该项目需要内核支持configFS文件系统
C# WPF - LiveCharts Project
少儿编程scratch项目源代码文件案例素材-恐怖叉子 动画.zip
嵌入式八股文面试题库资料知识宝典-嵌⼊式⼯程师⾯试⾼频问题.zip