总体思想:
1.前台网页用js得到裁剪图片的id及x,y,宽度和高度。
2.服务端根据id取出要裁剪的图片 。
3.根据这些参数来生成裁剪的图像。
后台代码如下:
package com.wodexiangce;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
/** *//**
*
*
* @author <a href="mailto:lqinglong@yahoo.cn">qinglong.lu</a>
*
* 2008-3-21
*/
public class OperateImage ...{
??????
??? //===源图片路径名称如:c:/1.jpg
??? private String srcpath ;
????????
??? //===剪切图片存放路径名称.如:c:/2.jpg
??? private String subpath ;
???
??? //===剪切点x坐标
??? private int x ;
???
??? private int y ;???
?????
??? //===剪切点宽度
??? private int width ;
????
??? private int height ;
???
??? public OperateImage()...{
???????????
??? }?
??? public OperateImage(int x,int y,int width,int height)...{
???????? this.x = x ;
???????? this.y = y ;
???????? this.width = width ;??
???????? this.height = height ;
??? }
???
??? /** *//**
???? * 对图片裁剪,并把裁剪完蛋新图片保存 。
???? */
??? public void cut() throws IOException...{
????????
??????? FileInputStream is = null ;
??????? ImageInputStream iis =null ;
????
??????? try...{??
??????????? //读取图片文件
??????????? is = new FileInputStream(srcpath);
???????????
??????????? /**//*
???????????? * 返回包含所有当前已注册 ImageReader 的 Iterator,这些 ImageReader
???????????? * 声称能够解码指定格式。 参数:formatName - 包含非正式格式名称 .
???????????? *(例如 "jpeg" 或 "tiff")等 。
???????????? */
??????????? Iterator<ImageReader> it = ImageIO.getImageReadersByFormatName("jpg");?
??????????? ImageReader reader = it.next();
??????????? //获取图片流
??????????? iis = ImageIO.createImageInputStream(is);
??????????????
??????????? /**//*
???????????? * <p>iis:读取源.true:只向前搜索 </p>.将它标记为 ‘只向前搜索’。
???????????? * 此设置意味着包含在输入源中的图像将只按顺序读取,可能允许 reader
???????????? *? 避免缓存包含与以前已经读取的图像关联的数据的那些输入部分。
???????????? */
??????????? reader.setInput(iis,true) ;
???????????
??????????? /**//*
???????????? * <p>描述如何对流进行解码的类<p>.用于指定如何在输入时从 Java Image I/O
???????????? * 框架的上下文中的流转换一幅图像或一组图像。用于特定图像格式的插件
???????????? * 将从其 ImageReader 实现的 getDefaultReadParam 方法中返回
???????????? * ImageReadParam 的实例。?
???????????? */
??????????? ImageReadParam param = reader.getDefaultReadParam();
????????????
??????????? /**//*
???????????? * 图片裁剪区域。Rectangle 指定了坐标空间中的一个区域,通过 Rectangle 对象
???????????? * 的左上顶点的坐标(x,y)、宽度和高度可以定义这个区域。
???????????? */
??????????? Rectangle rect = new Rectangle(x, y, width, height);
???????????
?????????????
??????????? //提供一个 BufferedImage,将其用作解码像素数据的目标。
??????????? param.setSourceRegion(rect);
??????????? /**//*
???????????? * 使用所提供的 ImageReadParam 读取通过索引 imageIndex 指定的对象,并将
???????????? * 它作为一个完整的 BufferedImage 返回。
???????????? */
??????????? BufferedImage bi = reader.read(0,param);???????????????
?????
??????????? //保存新图片
??????????? ImageIO.write(bi, "jpg", new File(subpath));????
??????? }
???????
??????? finally...{
??????????? if(is!=null)
?????????????? is.close() ;??????
??????????? if(iis!=null)
?????????????? iis.close();?
??????? }
???????
????????
????
??? }
??? public int getHeight() ...{
??????? return height;
??? }
??? public void setHeight(int height) ...{
??????? this.height = height;
??? }
??? public String getSrcpath() ...{
??????? return srcpath;
??? }
??? public void setSrcpath(String srcpath) ...{
??????? this.srcpath = srcpath;
??? }
??? public String getSubpath() ...{
??????? return subpath;
??? }
??? public void setSubpath(String subpath) ...{
??????? this.subpath = subpath;
??? }
??? public int getWidth() ...{
??????? return width;
??? }
??? public void setWidth(int width) ...{
??????? this.width = width;
??? }
??? public int getX() ...{
??????? return x;
??? }
??? public void setX(int x) ...{
??????? this.x = x;
??? }
??? public int getY() ...{
??????? return y;
??? }
??? public void setY(int y) ...{
??????? this.y = y;
??? }
??? public static void main(String[] args)throws Exception...{
???????
??????? String name = "d:/2005121210161588950.jpg";
???????
??????? OperateImage o = new OperateImage(100,100,100,100);
??????? o.setSrcpath(name);?
??????? o.setSubpath("D:/2.jpg");
??????? o.cut() ;?
?????????
??? }
}