读书人

自持画板的保持和读取

发布时间: 2012-10-28 09:54:44 作者: rapoo

自制画板的保持和读取
这几天学习的是将画板中的画保存在文件中,并且可以用自制的画板读取。通过数据输入输出流用2种方法实现了这个功能,分别是通过直接保存各个形状的对象到队列和伪BMP的方式实现。
1.通过队列保存
这种方法比较直接,即将画出的每个图形,依次保存到队列中,并将此队列用流输出到文件中,由于形状对象和写入格式都是自己定义的,所以保存到文件中后也只能通过自制的画板读取图像。
储存的核心代码:

public void saveStudents(String path, QueueRealize<shape> list) {try {// /创建一个文件输出流java.io.FileOutputStream fos = new java.io.FileOutputStream(path);// 将文件输出流包装成基本类型的数据流java.io.DataOutputStream dos = new java.io.DataOutputStream(fos);// 首先保存队列的长度dos.writeInt(list.retSize());// 遍历队列for (int i = 0; i < list.retSize(); i++) {shape shp = list.getData(i);String str = shp.getName();dos.writeInt(str.getBytes().length);// 写名字长度dos.write(str.getBytes());// 将名字转成字节数组写出int len = shp.getQri().retSize();dos.writeInt(len);//写入对象的坐标个数for (int j = 0; j < shp.getQri().retSize(); j++) {int v = shp.getQri().getData(j);dos.writeInt(v);//依次写入各个对象的各个坐标}int RGB = shp.getColor().getRGB();dos.writeInt(RGB);//写入对象的颜色}// 关闭数据流dos.flush();fos.close();} catch (Exception e) {e.printStackTrace();}}

读取的核心代码:
public QueueRealize<shape> readFile(String path) {// 创建一个队列用来保存读取到的对象QueueRealize<shape> list = new QueueRealize<shape>();try {// 创建文件输入流和数据输入流java.io.FileInputStream fis = new java.io.FileInputStream(path);java.io.DataInputStream dis = new java.io.DataInputStream(fis);// 读取一个Int,表示图像个数int len = dis.readInt();// 循环读取每一个图像信息for (int i = 0; i < len; i++) {int nameLen = dis.readInt();// 读名字的长度// 根据长度创建byte数组byte[] bs = new byte[nameLen];dis.read(bs);String name = new String(bs);//写入对象的坐标个数int pointNum = dis.readInt();int[] bs1 = new int[nameLen];for (int j = 0; j < pointNum; j++) {bs1[j] = dis.readInt();//依次写入各个对象的各个坐标}int cRGB = dis.readInt();java.awt.Color c = new java.awt.Color(cRGB);// 根据读取的数据类型创建一个对象if (name.equals("Line")) {Line line = new Line(bs1[0], bs1[1], bs1[2], bs1[3], c);// 将对象放入队列list.add(line);} else if (name.equals("Oval")) {Oval oval = new Oval(bs1[0], bs1[1], bs1[2], bs1[3], c);// 将对象放入队列list.add(oval);} else if (name.equals("Rect")) {Rect rect = new Rect(bs1[0], bs1[1], bs1[2], bs1[3], c);// 将对象放入队列list.add(rect);} else if (name.equals("Special")) {Special special = new Special(bs1[0], bs1[1], bs1[2],bs1[3], c);// 将对象放入队列list.add(special);} else if (name.equals("Polygon")) {Polygon polygon = new Polygon(bs1[0], bs1[1], bs1[2],bs1[3], c);for (int j = 4; j < pointNum; j++) {polygon.getQri().add(bs1[j]);}// 将对象放入队列list.add(polygon);}}} catch (Exception ef) {ef.printStackTrace();}return list;}

2.伪BMP方式保存
public class fBMP {int width;int height;int[][] colors;// 用来保存每一个像素点颜色的数组java.awt.Robot robot;public void savePic(JPanel panel) {try {robot = new java.awt.Robot();} catch (Exception ef) {ef.printStackTrace();}width = panel.getWidth();height = panel.getHeight();colors = new int[height][width];// 得到panel左上角的点相对于屏幕的坐标Point p = panel.getLocationOnScreen();java.awt.Rectangle rect = new java.awt.Rectangle(p.x, p.y,panel.getWidth(), panel.getHeight());// 从屏幕上抓取一张图片java.awt.image.BufferedImage img = robot.createScreenCapture(rect);//将点的rgb值储存到colors数组中for (int i = 0; i < colors.length; i++) {for (int j = 0; j < colors[i].length; j++) {colors[i][j] = img.getRGB(i, j);}}}public void loadPic(int[][] c, java.awt.Graphics g) {int height1 = c.length;int width1 = c[0].length;//根据得到的c数组创建颜色对象直接打印各个点for (int i = 0; i < height1; i++) {for (int j = 0; j < width1; j++) {java.awt.Color color = new java.awt.Color(c[i][j]);g.setColor(color);g.drawLine(i, j, i, j);}}}}

从两种方法的介绍中我们也就可以发现,第一种方法对于简单的图像的保存很快,而第二种则与图像的复杂简单无关,它的速度仅仅与图像的大小有关。




读书人网 >编程

热点推荐