这几天学习的是将画板中的画保存在文件中,并且可以用自制的画板读取。通过数据输入输出流用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方式保存
引用
典型的BMP图像文件由四部分组成:
1:位图头文件数据结构,它包含BMP图像文件的类型、显示内容等信息;
2:位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;
3:调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;
4:位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。
由此可以看出bmp文件基本上是由大量的像素组成的,所以我们也采用类似的方法,不管自制画板中有哪些图形,直接将画板绘画区域上所有的点储存。这就是伪BMP的基本思路。
以下是伪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);
}
}
}
}
从两种方法的介绍中我们也就可以发现,第一种方法对于简单的图像的保存很快,而第二种则与图像的复杂简单无关,它的速度仅仅与图像的大小有关。
- 大小: 25.4 KB
- 大小: 26.5 KB
分享到:
相关推荐
用自制画板打开和保存BMP格式文件。画板代码如下
模仿windows 自制画板
自制画板工具
android 模仿windows 自制画板.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
小画板mfc直线椭圆等工具自制小画板 矢量图制作
给文石(onyx boox)M92 Linux系统专用的绘图板程序
这Demo里边有一个1.jsp,它是传一个word文件,然后读取doc里的文字和图片到jsp显示。还有一个html5的画板Demo,可以再jsp里绘画,应该还有其他的比如编辑器的Demo,用了hibernate和struts2,运行tomcat前修改数据库...
画板
本文实例为大家分享了python openCV自制绘画板的具体代码,供大家参考,具体内容如下 import numpy as np import cv2 def nothing(x): pass cv2.namedWindow('image') img = np.zeros((512,512,3),np.uint8) cv2....
VB编写画板VB编写画板VB编写画板VB编写画板VB编写画板VB编写画板VB编写画板VB编写画板
几何画板最强中文永久免费5.06版本安装包下载解压安装即可几何画板最强中文永久免费5.06版本安装包下载解压安装即可几何画板最强中文永久免费5.06版本安装包下载解压安装即可几何画板最强中文永久免费5.06版本安装包...
ios画板源码ios画板源码ios画板源码ios画板源码ios画板源码
火山安卓高级画板实现画板开发源码
画板 MFCMFC做的画板MFC做的画板MFC做的画板MFC做的画板MFC做的画板MFC做的画板MFC做的画板MFC做的画板
1、实现友好的Windows画板界面,包括Windows基本菜单、画图功能菜单和常用菜单的工具栏。 2、实现画不同颜色,不同宽度,不同线型的线段、椭圆和矩形。 3、实现自定义字体的大小颜色并且输出到画图板上。 4、实现画...
python项目——超级画板.zip python项目——超级画板.zip python项目——超级画板.zip python项目——超级画板.zip python项目——超级画板.zip python项目——超级画板.zip python项目——超级画板.zip python项目...
将几何画板转换成EXE文件,这样运行几何画板文件就不需要安装几何画板了
画板Demo 画板的 Demo 例子 画板Demo 画板的 Demo 例子
js 画图 图画板js 画图 图画板js 画图 图画板js 画图 图画板
用java开发的网络画板,功能十分全面,可以实现在线画图,和聊天功能。