jfimage.java

来自「用Java开发的、实现类似Visio功能的应用程序源码」· Java 代码 · 共 674 行 · 第 1/2 页

JAVA
674
字号
/**
 *    $Id:JFImage.java $
 *
 *    Copyright 2004 ~ 2005  JingFei International Cooperation LTD. All rights reserved. *
 */
package com.jfimagine.jfgraph.shape.rectangle;


import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import java.util.Iterator;

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.GeneralPath;
import java.awt.geom.AffineTransform;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.MediaTracker;
import java.awt.Component;
import java.awt.image.ImageObserver;


import com.jfimagine.jfdom.Document;
import com.jfimagine.jfdom.Element;

import com.jfimagine.utils.commonutil.Base64;

import com.jfimagine.jfgraph.shape.rectangle.AbstractRectangle;
import com.jfimagine.jfgraph.shape.base.Node;
import com.jfimagine.jfgraph.shape.base.ObjectList;
import com.jfimagine.jfgraph.shape.base.AbstractObject;
import com.jfimagine.jfgraph.shape.base.AbstractShape;
import com.jfimagine.jfgraph.shape.base.ShapeConst;
import com.jfimagine.jfgraph.shape.base.JFVersion;

import com.jfimagine.jfgraph.shape.union.JFGroup;
import com.jfimagine.jfgraph.shape.union.JFPage;

import com.jfimagine.jfdraw.gui.dialog.FileDialog;

import com.jfimagine.jfgraph.geom.JFPoint;
import com.jfimagine.jfgraph.geom.Rect;
import com.jfimagine.jfgraph.geom.RoundedRect;
import com.jfimagine.jfgraph.geom.Arc;
import com.jfimagine.jfgraph.geom.GeomConst;

import com.jfimagine.utils.commonutil.CollectionUtil;

import com.jfimagine.utils.log.*;
 
 /**
 * JFImage class.  
 * A image class used to manage image process.
 *
 * @author     CookieMaker    
 *
 * @version $Revision: 1.00 $
 */  
 public class JFImage extends AbstractRectangle{

   /**
    *   A XML string tag represents an image
    */
   public  static final String	 XML_IMAGE		="JFImage";

   /**
    *   A XML string tag represents the image data
    */
   public  static final String	 XML_IMAGEDATA		="imageData";

   /**an internal log utility*/
   private static JFLogger m_logger=JFLogManager.getLogger("com.jfimagine.jfgraph.shape.rectangle.JFImage");
   
   /**
    *   An image buffer used to store original binary data of image.
    */
   private byte[] m_buffer;

   /**
    *   An image object used to represents the image.
    */
   private Image m_image;

   /**
    *   Component for image drawing.
    */
   private 	Component m_canvas;

   /**
    *   hide image sometimes necessary.
    */
   private 	boolean	 m_hideImage	=false;
 
   
   /**
    *   Constructor for JFImage.
    */
   public JFImage(){
   	setObjectType(ShapeConst.SHAPETYPE_IMAGE);
   	setXMLTag(XML_IMAGE); 

	//to clear line and fill format to avoid global settings.   	
   	getLineFormat().clearFormat();
   	getFillFormat().clearFormat();
   }	

   /**
    *   Constructor for JFImage.
    *   @param image An image parameter that already built.
    *   @param imageObserver A new image observer(drawing canvas).
    */
   public JFImage(Image image,Component imageObserver){
   	setObjectType(ShapeConst.SHAPETYPE_IMAGE);
   	setXMLTag(XML_IMAGE);

   	m_image		=image;
   	m_canvas        =imageObserver;	
	setImageSize();  
	finishDrawing(); 	
   }	

   /**
    *  set image size from the image object and image observer.
    */
   private void setImageSize(){
   	if (m_image!=null && m_canvas!=null){
   		setRect(0,0,m_image.getWidth(m_canvas),m_image.getHeight(m_canvas));
   	}
   }	


   /**
    *   Set current image's canvas for furthur image drawing.
    * 
    *   @param imageObserver A new image observer(drawing canvas).
    *
    */ 	
  public void setCanvas(Component imageObserver){
  	m_canvas	=imageObserver;
  }

   /**
    *   Set the image content of current object.
    * 
    *   @param image An new image object.
    *   @param imageObserver A new image observer(drawing canvas).
    *
    */ 	
  public void setImage(Image image,Component imageObserver){
  	m_image		=image;
  	m_canvas        =imageObserver;
	setImageSize();   	
  }


   /**
    *   Add a new node for current node list.
    *   here this method will always be called by DrawState class or any drawing class.
    * 
    *   @param x, y Coordinates of a new node.
    *
    */ 	
   public void addNode(double x, double y){
	super.addNode(x,y);
	
	if (m_nodeAdded>1){
   		//left-top point and right-bottom point:
   		JFPoint pnt1	=m_firstNode;
   		JFPoint	pnt2	=new JFPoint(x,y);
		    	
   		m_rect.setVertex(Rect.VERTEXTYPE_LEFTTOP,pnt1.getX(),pnt1.getY());
   		m_rect.setVertex(Rect.VERTEXTYPE_RIGHTTOP,x,pnt1.getY());
   		m_rect.setVertex(Rect.VERTEXTYPE_LEFTBOTTOM,pnt1.getX(),y);
   		m_rect.setVertex(Rect.VERTEXTYPE_RIGHTBOTTOM,x,y);

   		initNodes();
   	}
   }  

   	

   /**
    *   Move/adjust a node of current object.
    * 
    *   @param  node Currently moving node.
    *
    *   @param  x, y Moving offsets.
    *
    *   @param g current drawing canvas.
    *
    */ 	
   public void  moveNode(Node node, double x, double y,Graphics g){
   	m_hideImage	=true;
   	super.moveNode(node,x,y,g);

	if (node!=null){
		if (node.getXOffset()!=x || node.getYOffset()!=y){
			//move node and draw a new dragging shape.
			int vertexType	=getVertexTypeByNode(node);
   			m_rect.moveVertex(vertexType,x,y,Rect.VERTEXMOVETYPE_RECTANGLE);

   			//init shape nodes.
			initNodes();
		   		
   			//draw current moving node and its relational lines
   			draw(g,true);
   		}
	}
   	m_hideImage	=false;
   }


   /**
    *   Test if can draw image now.
    *   @return true if can draw, false otherwise.
    *
    */ 	
   private boolean canDrawImage(){
   	return (!m_hideImage && m_image!=null);
   }
 
   /**
    *   Draw current image on graphics context.
    *   @param g A specified graphics context to draw the image.
    *
    */ 	
   private void drawImage(Graphics g){
     
  	double zoom	=getZoomScale();
     	double angle	=getRotateAngle();

     	if (m_image==null ){
     		m_logger.error("drawImage: image or observer not assigned!");
     		return;
	}
  	
  	//get original rectangle
     	Rect rect	=getOriginalRect(); 
	rect.setValue(rect.getX() * zoom, rect.getY() * zoom, rect.getWidth() * zoom, rect.getHeight() * zoom);
	     
     	Graphics2D g2d = (Graphics2D)g;

     	if (angle==0){
     		//draw plain image
        	g2d.drawImage(m_image,(int)rect.getX(), (int)rect.getY(), (int)rect.getWidth(), (int)rect.getHeight(), null);
     	}else{
     		//draw rotated image
     		AffineTransform origXform = g2d.getTransform();
     		AffineTransform newXform = (AffineTransform)(origXform.clone());
     		
     		//center of rotation is center of the panel
     		JFPoint	center	=rect.getCenter();
     		int xRot = (int)center.getX();
     		int yRot = (int)center.getY();
     		newXform.rotate(angle, xRot, yRot);
     		g2d.setTransform(newXform);
     		
        	g2d.drawImage(m_image,(int)rect.getX(), (int)rect.getY(), (int)rect.getWidth(), (int)rect.getHeight(), null);
     		g2d.setTransform(origXform);
     	}


   }


   
   /**
    *   Draw current object on graphic canvas.
    * 
    *   @param  g  A graphic canvas.	
    *   @param  isXorMode If is in xor mode now.
    *
    */ 	
   public void  draw(Graphics g,boolean isXorMode){
   	if (g==null)
   		return;

   	//if user hide this shape, we'll draw an 'invisible' bounds here.	
   	if (isInvisible()){
   		drawInvisibleBounds(g,isXorMode);
   		return;
   	}	
   		
   	if (canDrawImage() && !isXorMode){

        	if (!isXorMode)
			setTransparencyComposite(g);
   		//draw image only
   		drawImage(g);

        	if (!isXorMode)
			restoreTransparencyComposite(g);
		
   		drawPort(g);
   		drawLabel(g);
	}else{
		//draw the rectangle frame only
		super.draw(g,isXorMode);	
	}
   }   


   /**
    *   Load an image file to this object.
    * 
    *   @param imageFile File name of an image.
    *
    */ 	
   public boolean loadImage(String imageFile){
   	try{
   		File file	=new File(imageFile);
   		boolean result	=loadImage(file);
   		
   		file	=null;
   		return result;

        }catch (Exception e) { 
               m_lastError	=e.getMessage();
               m_logger.error("loadImage: "+m_lastError);
               return false;
        } 

	/*
   	
        try { 
        	if (!FileDialog.isImageFile(imageFile)){
        		m_lastError	="File: "+imageFile+" is not a valid image file!";
        		System.out.println(m_lastError);
        		return false;
        	}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?