//@author luce
1.前台,上传一张图片,并传值开始切点的坐标和杂志封面模板(png格式)的编号
2.用java裁剪图片
3.java图片合成"上传用户图片与杂志封面模板合成"
//------------
package duba.common.tools;
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;
public class CutImage {
//===源图片路径名称如: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 CutImage(){
}
public CutImage(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 ;
System.out.println("-----------------cut Image-----------2");
try{
//读取图片文件
is = new FileInputStream(srcpath);
System.out.println("-----------------cut Image-----------44");
/**//*
* 返回包含所有当前已注册 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);
System.out.println("-----------------cut Image4-----------");
//提供一个 BufferedImage,将其用作解码像素数据的目标。
param.setSourceRegion(rect);
/**//*
* 使用所提供的 ImageReadParam 读取通过索引 imageIndex 指定的对象,并将
* 它作为一个完整的 BufferedImage 返回。
*/
BufferedImage bi = reader.read(0,param);
System.out.println("成功生成");
//保存新图片
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:/1.jpg";
// CutImage o = new CutImage(100,100,100,100);
// o.setSrcpath(name);
// o.setSubpath("D:/2.jpg");
// o.cut() ;
// }
}
//-------------------------------------------------------------------servlet 调用
package duba.servlets;
import java.io.*;
import java.util.Calendar;
import java.awt.*;
import java.awt.image.*;
import duba.common.tools.CutImage;
import javax.imageio.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.imageio.ImageWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.PrintWriter;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import sun.awt.image.GifImageDecoder;
import java.awt.*;
import java.awt.image.*;
import com.sun.image.codec.jpeg.*;
public class CreateImageServlet extends HttpServlet {
/**
* Constructor of the object.
*/
public CreateImageServlet () {
super();
}
/**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to post.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("-----------------cut Image-----------");
response.setContentType("text/html;charset=GB2312");
response.addHeader("Cache-Control","no-cache");
response.addHeader("Expires","Thu,01 Jan 1970 00:00:01 GMT");
PrintWriter pageout = response.getWriter();
HttpSession session=request.getSession();
int x=0;int y=0;String c="1";
if(request.getParameter("x")!=null)
x=Integer.parseInt(request.getParameter("x").toString());
if(request.getParameter("y")!=null)
y=Integer.parseInt(request.getParameter("y").toString());
if(request.getParameter("c")!=null)
c=request.getParameter("c").toString();
String name =" ";
if(session.getAttribute("Magazinefmname")!=null){
name="../webapps/duba/magazine/userup_pic/"+session.getAttribute("Magazinefmname").toString();
session.removeAttribute("Magazinefmname");
}
CutImage o = new CutImage(x,y,280,395);
o.setSrcpath(name);
Calendar calendar = Calendar.getInstance();
String filename = "cutpic"+String.valueOf(calendar.getTimeInMillis())+".jpg"; //毫秒记名
o.setSubpath("../webapps/duba/magazine/userup_pic/"+filename);
o.cut() ;
System.out.println("-----------------cut Image图片合成-----------");
System.out.println("剪切的文件名为"+filename);
File file1 = new File("../webapps/duba/magazine/userup_pic/"+filename); //底层图片
File file2 = new File("../webapps/duba/magazine/cover/cover"+c+".png"); //上层图片
Image src = javax.imageio.ImageIO.read(file1);
System.out.print("底层图片加载完成...");
System.out.print("上层图片加载完成...");
Image src2 = javax.imageio.ImageIO.read(file2);
int width=src.getWidth(null); //得到源图宽
int height=src.getHeight(null); //得到源图长
BufferedImage tag = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
String filename2 = "coverpic"+String.valueOf(calendar.getTimeInMillis()); //毫秒记名
FileOutputStream out=new FileOutputStream("../webapps/duba/magazine/userup_pic/"+filename2+".jpg"); //输出到文件流,生成最后的杂志封面
System.out.print("杂志封面图片生成完成...文件名为:"+filename2+".jpg");
session.setAttribute("coveruserPic", filename2+".jpg");
Graphics g = tag.createGraphics();
g.fillRect(0,0,width,height);
g.setClip(0, 0, width, height);
g.drawImage(src,0,0,width,height,null);
g.drawImage(src2,0,0,width,height,null);
g.dispose();
System.out.print(g.getColor());
//GifImageDecoder gifencod=ImageDecoder.
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(tag); //近JPEG编码
System.out.print(width+"*"+height);
out.close();
pageout.print("<SCRIPT language=''javascript''>");
pageout.print("window.top.location=/"../magazine/CoverPic_gen.jsp /"");
pageout.print("</SCRIPT>");
}
/**
* Initialization of the servlet. <br>
*
* @throws ServletException if an error occure
*/
public void init() throws ServletException {
// Put your code here
}
}