(1)先定义要实现的类,我先定义了一个抽象类
复制代码代码如下:
//图形类
abstract class Shape{
int x,y;
int x1,y1;
Color color ;
Graphics g ;
byte type ;
public abstract void draw(Graphics g) ;
}
//直线类
class LineShape extends Shape{
public LineShape(int x, int y ,int x1,int y1,Color color){
this.x = x ;
this.y = y ;
this.x1 = x1 ;
this.y1 = y1 ;
this.color = color ;
this.type = 0;
}
@Override
public void draw(Graphics g) {
g.setColor(color) ;
g.drawLine(x, y, x1, y1) ;
}
}
//圆类
class OvalShape extends Shape{
public OvalShape(int x,int y, int x1,int y1,Color color){
this.x = x ;
this.y = y ;
this.x1 = x1 ;
this.y1 = y1 ;
this.color = color ;
this.type = 1;
}
@Override
public void draw(Graphics g) {
g.setColor(color) ;
g.drawOval((x+x1)/2,(y+y1)/2,(x1-x)/2 ,(y1-y)/2 );
}
}
//图片类
class picture extends Shape{
int a ;
int b ;
int cl[][] ;
public picture(int a,int b,int cl[][]){
this.type =2 ;
this.a =a ;
this.b =b ;
this.cl =cl ;
}
public void draw(Graphics g){
for(int k=0;k<a;k++){
for(int j=0;j<b;j++){
Color c = new Color(cl[k][j]) ;
g.setColor(c);
g.drawLine(k+100,j+100,k+100,j+100);
}
}
}
}
(2)总方法类
复制代码代码如下:
public class BmpSaveStart {
Graphics g ;
public static void main(String[] args) {
new BmpSaveStart() .UI();
}
public void UI(){
JFrame jf = new JFrame();
jf.setSize(600,600);
jf.setTitle("图片的存储");
jf.setBackground(Color.WHITE );
JMenuBar bar = new JMenuBar() ;
JMenu menu1 = new JMenu("选项") ;
JMenuItem m1 = new JMenuItem("画圆");
JMenuItem m2 = new JMenuItem("画线");
JMenuItem m3 = new JMenuItem("存储");
JMenuItem m4 = new JMenuItem("打开");
JMenuItem m5 = new JMenuItem("图片");
menu1.add(m1) ;
menu1.add(m2) ;
menu1.add(m3) ;
menu1.add(m4) ;
menu1.add(m5) ;
bar.add(menu1);
jf.setJMenuBar(bar);
jf.setDefaultCloseOperation(3);
jf.setVisible(true) ;
PaintDemo p = new PaintDemo(g,jf) ;
m1.setActionCommand("画圆");
m2.setActionCommand("画线");
m3.setActionCommand("存储");
m4.setActionCommand("打开");
m5.setActionCommand("图片") ;
m1.addActionListener(p);
m2.addActionListener(p);
m3.addActionListener(p);
m4.addActionListener(p);
m5.addActionListener(p);
}
}
(3)监听类
复制代码代码如下:
class PaintDemo implements MouseListener,ActionListener{
ImageIcon img = new ImageIcon("Images/100.gif");
BufferedImage bufImage = new BufferedImage(img.getIconWidth(),img.getIconHeight(),BufferedImage.TYPE_INT_RGB);
int x,y;
int x1,y1;
JFrame jf ;
Graphics g ;
String str ;
Color c ;
int cr ;
int cl[][] = new int[1000][1000] ;
ArrayList<Shape> shapes = new ArrayList<Shape>() ;
Random random =new Random() ;
int R ;
int G ;
int B ;
public PaintDemo( Graphics g ,JFrame jf){
this.jf = jf;
this.g = jf.getGraphics();
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
x=e.getX();
y=e.getY();
}
@Override
public void mouseReleased(MouseEvent e) {
x1 = e.getX();
y1 = e.getY();
setColor() ;
if(str.equals("画圆")){
// paintOval();
Shape shape = new OvalShape(x, y, x1, y1,c) ;
shape.draw(g);
shapes.add(shape) ;
}
if(str.equals("画线")){
//paintLine();
Shape shape = new LineShape(x, y, x1, y1,c) ;
shape.draw(g);
shapes.add(shape) ;
/*File f =new File("D:\\test.txt") ;
if(f==null){
try {
f.createNewFile();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}*/
}
}
public void saveFile(String path,ArrayList<Shape> shapes){
try{
//文件输出流
FileOutputStream fos = new FileOutputStream(path) ;
//将文件输出流包装成可写基本类型的流
DataOutputStream dos = new DataOutputStream(fos) ;
dos.writeInt(shapes.size());//写入队列中图形的个数
//读取队列
for(int i=0;i<shapes.size();i++){
//取出一种形状
Shape shape = shapes.get(i);
byte type = shape.type ;
if(type==0){//根据type判断类型,如果是直线
System.out.println("开始存储直线") ;
dos.writeByte(type);
LineShape line = (LineShape) shape ;//强制转换为直线类
//写直线形状的数据;
int x = line.x ;
int y = line.y ;
int x1 = line.x1 ;
int y1 = line.y1 ;
Color color = line.color ;
cr = color.getRGB();
dos.writeInt(x);
dos.writeInt(y);
dos.writeInt(x1);
dos.writeInt(y1);
dos.writeInt(cr);
}else if(type == 1){
dos.writeByte(type);
System.out.println("开始存储圆") ;
OvalShape oval = (OvalShape) shape ;//强制转换为圆类
//写直线形状的数据;
int x = oval.x ;
int y = oval.y ;
int x1 = oval.x1 ;
int y1 = oval.y1 ;
Color color = oval.color ;
cr = color.getRGB() ;
dos.writeInt(x);
dos.writeInt(y);
dos.writeInt(x1);
dos.writeInt(y1);
dos.writeInt(cr);
}else if(type ==2){
dos.writeByte(type) ;
picture pl = (picture) shape ;
System.out.println("开始存储图片") ;
int width = pl.a ;
int height = pl.b ;
dos.writeInt(width) ;
dos.writeInt(height) ;
for(int k=0;k<width;k++){
for(int j=0;j<height;j++){
int t = pl.cl[k][j];
dos.writeInt(t) ;
}
}
}
}
dos.flush() ;
fos.close();
}catch(Exception e){
e.printStackTrace();
}
}
public ArrayList<Shape> readFile(String path){
try{
//创建文件对象的输入流
FileInputStream fis = new FileInputStream(path);
//将文件输入流包装成可读基本类型的流
DataInputStream dis = new DataInputStream(fis);
//先读取文件长度,即总共的形状个数
int len = dis.readInt() ;
for(int i=0 ;i<len;i++){
byte type = dis.readByte();
if(type==0){
int a= dis.readInt();
int b= dis.readInt();
int c= dis.readInt();
int d= dis.readInt();
Color f= new Color(dis.readInt());
LineShape line = new LineShape(a,b,c,d,f);
//读取直线的设置
//将直线存入队列
shapes.add(line) ;
}else if(type == 1){
int a= dis.readInt();
int b= dis.readInt();
int c= dis.readInt();
int d= dis.readInt();
Color f= new Color(dis.readInt());
System.out.println("开始读取圆") ;
OvalShape oval = new OvalShape(a,b,c,d,f);
shapes.add(oval) ;
}else if(type == 2){
int a= dis.readInt();
int b= dis.readInt();
for(int k=0;k<a;k++){
for(int j=0;j<b;j++){
cl[k] [j] = dis.readInt();
}
}
picture pic = new picture(a,b,cl) ;
shapes.add(pic) ;
}
}}catch(Exception e){
e.printStackTrace();
}
return shapes ;
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
public void setColor(){
R =random.nextInt(255);
G =random.nextInt(255);
B =random.nextInt(255);
c=new Color(R,G,B) ;
}
/* public void paintLine(){
setColor();
g.drawLine(x, y, x1, y1) ;
}
public void paintOval(){
setColor();
g.drawOval((x+x1)/2,(y+y1)/2,(x1-x)/2 ,(y1-y)/2 );
}
*/
@Override
public void actionPerformed(ActionEvent e) {
str = e.getActionCommand() ;
jf.addMouseListener(this);
if(str.equals("存储")){
saveFile("D:\\test.txt",shapes) ;
}
if(str.equals("打开")){
readFile("D:\\test.txt") ;
for(int i=0;i<shapes.size();i++){
Shape shape = shapes.get(i);
if(shape.type ==0){
System.out.println("确定是圆类型");
LineShape line = (LineShape)shape ;
line.draw(g);
}else if(shape.type==1){
System.out.println("确定是圆类型");
OvalShape oval = (OvalShape)shape ;
oval.draw(g);
}else if(shape.type ==2){
System.out.println("确定是图片类型");
picture pl = (picture)shape ;
pl.draw(g) ;
}
}
}
if(str.equals("图片")){
Thread th = new Thread(new Runnable(){
public void run(){
while(true){
try{
Thread.sleep(30) ;
Graphics g1 = bufImage.getGraphics();
g1.drawImage(img.getImage(), 0,0,null);
jf.getGraphics().drawImage(bufImage,100,100,null) ;
int width = bufImage.getWidth();
int height = bufImage.getHeight() ;
for(int k=0;k<width;k++){
for(int j=0;j<height;j++){
int p =bufImage.getRGB(k,j) ;
cl[k][j] = p ;
}
}
picture pe =new picture(width,height,cl);
shapes.add(pe);
}catch(Exception e){
e.printStackTrace();
}
}
}});
th.start();
}
}
}