前面我学习了绘制画板以及画板的重绘,最近学习将画板数据保存成文件,与大家分享下。关于画板的保存有两种方式。先说说用队列来保存文件吧:首先需要将重绘时用来保存对象的队列按我们定义的文件格式写入文件:
/**
* 保存图形的方法
* @param path路径
* @param li队列
* @return 返回保存是否成功。
*/
public boolean SaveFile(String path,ListImpl li){
boolean state = false;
try{
//实例化输出流对象
OutputStream fis = new FileOutputStre(path);
DataOutputStream dos = new DataOutputStream(fis);
//写入队列的长度
dos.writeInt(li.size());
//循环
for(int i=0;i<li.size();i++){
Graph graph= (Graph)li.get(i);
//获取图形
byte item = graph.getItem();
//写入图形
dos.writeByte(item);
//写入坐标和宽高
int x1 = graph.getX1();
int y1 = graph.getY1();
int x2 = graph.getX2();
int y2 = graph.getY2();
dos.writeInt(x1);
dos.writeInt(y1);
dos.writeInt(x2);
dos.writeInt(y2);
//写入颜色
int r = graph.getColor().getRed();
int g = graph.getColor().getGreen();
int b = graph.getColor().getBlue();
dos.writeInt(r);
dos.writeInt(g); dos.writeInt(b);
}
dos.close();
os.close();
state = true;
}catch(IOException e){
e.printStackTrace();
}
return state;
}
文件的打开就是将数据从存储器中取出来,要注意的地方是我们是按照什么顺序写出去的,就按照相同的顺序读取进来,然后每次读取一个形状就将读取到的数据重新包装成对象,保存到一个队列去:
/**
* 打开图形方法
* @param path:路径
* @return:返回打开是否成功
*/
public boolean OpenFile(String path){
boolean state = false;
try{
//实例化输入流对象
InputStream fis = new FileInputStream(path);
DataInputStream dis = new DataInputStream(fis);
//读取图形总数
int size = dis.readInt();
//循环
for(int i=0;i<size;i++){
byte item = (byte) dis.readByte();
//读取坐标和宽高
int x1 = dis.readInt();
int y1 = dis.readInt();
int x2 = dis.readInt();
int y2 = dis.readInt();
//读取颜色
int r = dis.readInt();
int g = dis.readInt();
int b = dis.readInt();
Color color = new Color(r,g,b);
Graph graph = new Graph(item,color,x1,y1,x2,y2);
DrawListener.li.add(graph);
}
dis.close();
fis.close();
state = true;
}catch(IOException e){
e.printStackTrace();
}
return state;
}
}
这样保存和打开文件的基本代码就完成了,还需要在窗体上增加保存和打开两个按钮,然后加上一个ActionListener:
//使用匿名内部类方法来实现按钮的动作事件处理类
ActionListener al = new ActionListener(){
//动作事件的处理
public void actionPerformed(ActionEvent e){
//判断当前点击的按钮是否是Color
if(e.getActionCommand().equals("Color")){
color = JColorChooser.showDialog(null,"选择颜色",Color.RED);
System.out.println("Color:"+color);
}else if(e.getActionCommand().equals("Save")){
SaveOpen so = new SaveOpen();
//得到保存路径
boolean state = so.SaveFile("D:\\study0727\\draw", DrawListener.li);
System.out.println("保存成功!"+state);
}else if(e.getActionCommand().equals("Open")){
SaveOpen so = new SaveOpen();
//得到打开路径
boolean state = so.OpenFile("D:\\study0727\\draw");
.out.println("打开文件!"+state);
//调用重绘方法
up();

}else if(e.getActionCommand().equals("Line")){
item = 0;
System.out.println("你点击的按钮是Line");
}else if(e.getActionCommand().equals("Rect")){
item = 1;
System.out.println("你点击的按钮是Rect");
}else if(e.getActionCommand().equals("Oval")){
item = 2;
System.out.println("你点击的按钮是Oval");
}
}
};
到这里用队列保存画图板的文件就算完成了,当然这个文件格式是我们自己定义的,按照这种方式保存的图片用我们常用的图片查看器是打不开的,那是因为那些图片查看器不知道我们保存文件的格式。但用正版的BMP格式来保存文件还有问题,那就用山寨版的BMP来保存画板文件吧。与队列保存文件一样都需要读取文件和打开文件步骤。用输入流、输出流来完成。
/**
* 读取文件
* @param path
* @return
*/
public int[][] readFile(String path) {
try {
// 根据文件路径创建一个文件输入流
java.io.FileInputStream fis = new java.io.FileInputStream(path);
java.io.DataInputStream dis=new java.io.DataInputStream (fis);
dis.readInt();
// 根据字节数创建一个字节数组
int[][] colors=new int[width][height];
int t = dis.read();
while (t != -1) {// 如果没有到达文件末尾,就循环读取
for (int i = 0; i < width; i++) {
for (int j = 0; j <height ; j++) {
colors[i][j] = t;
// 继续读取下一个字节
t = dis.read();
}
}
}

// 关闭流
fis.close();
return colors;
} catch (Exception ef) {
ef.printStackTrace();
}
return null;
}
/**
* 保存到文件
*/
public void writeFile(String path,MyPanel panel) throws Exception{
// 创建一个文件输出流,如果文件不存在,会自动创建一个文件
java.io.FileOutputStream fos = new java.io.FileOutputStream(path);
java.io.DataOutputStream dos=new java.io.DataOutputStream(fos);
dos.writeInt(width);
dos.writeInt(height);
huaban.colors = new int[width][height];
for (int i = 0; i < width; i++) {
for (int j = 0; j <height ; j++) {
dos.write(huaban.colors[i][j]);
}
}
// 强制输出
dos.flush();
// 关闭流
fos.close();
}
同样需要在窗体上增加保存和打开两个按钮,然后给按钮加动作监听器
public void actionPerformed(ActionEvent e) {
// 得到按钮文字
String text = e.getActionCommand();
// 选择颜色
if (text.equals("选择颜色")) {
color = javax.swing.JColorChooser.showDialog(null, "请选择颜色",Color.black);
} else if(text.equals("保存")){
String path="D:\\画板保存.Bmp";
try {
writeFile(path,jp);
} catch (Exception e1) {
e1.printStackTrace();
}
System.out.println("保存完毕");
}else if(text.equals("打开")){
String path="D:\\画板保存.Bmp";
readFile(path);
System.out.println("打开完毕");
}
str = text;
System.out.println(str);

}
此方法最不同于队列保存的地方是:定义保存图片的方法
public void savePic(MyPanel panel){
//确定需要保存的区域JPanel
//设置初始数组为空
huaban.colors=null;
// 得到panel左上角的点相对于屏幕的坐标
Point p = panel.getLocationOnScreen();
//得到JPanel左上角的坐标、宽度、高度
width = panel.getWidth();
height = panel.getHeight();
huaban.colors = new int[width][height];
//根据JPanel左上角的坐标、宽度、高度创建一个屏幕区域对象
java.awt.Rectangle rect = new java.awt.Rectangle(p.x, p.y,
panel.getWidth(), panel.getHeight());
try {

//创建一个机器人
robot = new java.awt.Robot();
} catch (Exception ef) {
ef.printStackTrace();
}
// 从屏幕上抓取一张图片
java.awt.image.BufferedImage img =
robot.createScreenCapture(rect);
//遍历数组
for (int i = 0; i < width; i++) {
for (int j = 0; j <height ; j++) {
//得到图像上每个坐标点RGB颜色,并将颜色对应的保存到数组中
huaban.colors[i][j] = img.getRGB(i, j);
}
}

}

画板数据保存成文件的两种方法小结相关推荐

  1. iOS开发小技巧--边接受数据边写入文件的两种方法

    一.NSFileHanle 使用注意点:在往文件写入数据时,必须创建一个空的文件 指定文件写入的方式 -- 覆盖还是追加 最后记得关闭 <1>代码是在大文件传输的练习中截取的.写入数据之前 ...

  2. python numpy读取数据_大神教你python 读取文件并把矩阵转成numpy的两种方法

    导读 今天小编就为大家分享一篇python 读取文件并把矩阵转成numpy的两种方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 在当前目录下: 方法1: file = open( ...

  3. python把矩阵存为文件_python 读取文件并把矩阵转成numpy的两种方法

    在当前目录下: 方法1: file = open('filename') a =file.read() b =a.split('\n')#使用换行 len(b) #统计有多少行 for i in ra ...

  4. python大神读取_大神教你python 读取文件并把矩阵转成numpy的两种方法

    导读 今天小编就为大家分享一篇python 读取文件并把矩阵转成numpy的两种方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 在当前目录下: 方法1: file = open( ...

  5. 多个PDF文件如何合并成一个?两种方法轻松get

    在日常学习生活中,如果你需要将多个文档整合为一个完整的文件,比如说多篇文章.多张图片.多个表格等等,这时候就需要将这些文档合并成一个PDF文件.如何将多个PDF文件如何合并成一个?两种方法轻松帮你搞定 ...

  6. C#读写txt文件的两种方法介绍[转]

    C#读写txt文件的两种方法介绍 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char数组,然后输出 ...

  7. 合并BIN文件的两种方法

    合并BIN文件的两种方法 在单片机的开发过程中,经常需要将两个单独的BIN文件合并成一个文件,方便烧写和生产.下面结合STM32的IAP Bootloader Code和Application Cod ...

  8. html5保存到桌面,win8.1将IE浏览器网页内容保存到电脑桌面的两种方法

    win8.1系统使用IE浏览器浏览网页的时候,看到有用的网页内容,想要保存下来,这样即使在没有联网的情况下也能够打开该网页查看.那么win8.1将IE浏览器网页内容保存到电脑桌面呢?下面小编介绍两种方 ...

  9. java遍历文件和归类_java读取文件的两种方法:java.io和java.lang.ClassLoader

    java读取文件的两种方法:java.io和java.lang.ClassLoader 什么时候使用java.io,什么时候使用java.lang.ClassLoader呢? (注:要是之前读xml文 ...

最新文章

  1. js变量后面加问号是什么_js没那么简单(1)-- 执行上下文
  2. 【最小生成树】Prim算法和Kruskal算法的区别对比
  3. HDU 3729 I#39;m Telling the Truth(二部图最大匹配+结果输出)
  4. vba随机抽取人名不重复_excel启用宏,通过vba实现从数字数组里随机获取N个不重复的数字...
  5. B站左程云算法视频高级班04
  6. 数据分析常用的100个指标和术语
  7. 2022-2027年中国OLED市场竞争态势及行业投资前景预测报告
  8. python群发邮箱软件下载_python qq邮件群发
  9. 大疆网上测评题库_大疆在线测评 - 逻辑题
  10. 4.2 存储器读写指令的发射与执行2
  11. Laravel框架使用maatwebsite/excel导出自动换行
  12. mate30首发鸿蒙系统,华为mate30首发鸿蒙系统,mate20 Pro再降两千元
  13. 【UE】倒计时归零时结束游戏
  14. 计算机输入法在桌面显示不出来的,电脑桌面输入法不见了怎么办?
  15. 内插和数字上变频技术
  16. Android 字符串格式化 千位符
  17. 智慧警务:如何利用视频智能分析技术助力城市警务可视化综合监管与指挥系统
  18. 巴菲特卸任后盖茨梅琳达与四位新理事共管盖茨基金会;Club Med中国第三家冰雪度假村开业 | 美通社头条...
  19. 自学Python有哪些不错的书籍推荐?
  20. 十问公务员(迄今为止我看到的最全面客观的评价)

热门文章

  1. 样本方差为何除以n-1而不是n?
  2. 微贷七年之痒:重线下、追科技、争存量,能否赢未来?
  3. 倾斜摄影三维建模软件photoscan教程 [转]
  4. App怎样提高推广转化率
  5. 哈希(哈希表的应用)
  6. 【关键字】ddx ddy 导数函数
  7. 机器学习VS深度学习,两者区别在哪里?
  8. 大数据联姻“互联网+”驱动绿色变革
  9. excel利用宏自动复制来自其他excel文件的数据
  10. 塔顶放大器在移动通信网中的作用