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 + -
显示快捷键?