`

java 生成缩略图

阅读更多
前台页面index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gbk" />
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<title>绝对定位+jquery.animate方法打造低成本炫彩相册</title>
	
<link rel="stylesheet" type="text/css" href="css/style2.css" />
<link rel="stylesheet" type="text/css" href="css/lightbox.css" media="screen" />
<script src="js/jquery-1.3.2.min.js" type="text/javascript"></script>
<script src="js/longGallery.js" type="text/javascript"></script>
<script src="js/jquery.lightbox-min.js" type="text/javascript"></script>

<script>

 function startOnload(){
 /*
 var arrys=new Array('1.jpg','2.jpg','3.jpg','4.jpg','5.jpg','6.jpg','7.jpg','8.jpg','9.jpg','10.jpg','11.jpg','12.jpg','13.jpg','ce2c4-large.jpg');

var docs=document.getElementById("ul_gallery");
 //var docs=document.createElement("ul");

 for(i=0;i<arrys.length;i++){
   var mydiv=document.createElement("li"); 
   mydiv.setAttribute("id","itemdiv"); 
   mydiv.innerHTML="<a href='H:/image/item/"+arrys[i]+" '><img src='H:/image/item/"+arrys[i]+"' alt='' /></a>";
   docs.appendChild(mydiv);
     }
   */
     endOnload();
 }
  </script>
</head>
  
  <body onload="startOnload()">
  
  
  
  
  
  
   <br><br>
     图片缩放测试 <br/>
     <img src="imageServlet" />
     <img src="imageServlet?size=2" />
        <img src="imageServlet?size=4" />
        <img src="imageServlet?size=6" />
        <div id="wrapper">


<div id="galleryBox">
<p id="p_bot"><span id="span_prev">&laquo;</span><span id="span_auto"></span><span id="span_next">&raquo;</span></p>

<ul id="ul_gallery">
<li><a href="images\11.jpg"><img src="images\11.jpg" alt="" /></a></li>
<li><a href="imageServlet?size=2"><img src="imageServlet?size=2" alt="" /></a></li>
<li><a href="imageServlet?size=4"><img src="imageServlet?size=4" alt="" /></a></li>
<li><a href="imageServlet?size=6"><img src="imageServlet?size=6" alt="" /></a></li>
</ul>

<span id="this_prev">&raquo;</span><span id="this_next">&laquo;</span>

</div>

</div>

  </body>
</html>



wed.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	
<servlet>
 <servlet-name>ImageServlet</servlet-name>
 <servlet-class>org.img.ImageServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>ImageServlet</servlet-name>
 <url-pattern>/imageServlet</url-pattern>
</servlet-mapping>
	
	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>



ImageServlet.java

package org.img;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ImageServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//设置页面的头信息
		response.setHeader("Cache-Control", "no-store");
		response.setHeader("Pragma", "no-cache");
		response.setDateHeader("Expires", 0);
		response.setContentType("image/jpeg");

		// 图片放在当前应用的images目录下 如 http://www.xxx.com/ 下的文件目录。
		String path = getServletContext().getRealPath("images/22ww.jpg");
		//构建一个带缓存的图片读取流
		BufferedImage image1 = ImageIO.read(new File(path));
		//获得从页面传来的值,此参数是用来设置缩略图的大小
		String size=request.getParameter("size");
		     
		if(size==null){
			//源图的比例传入页面
			ImageIO.write(image1, "JPEG", response.getOutputStream());			
		}else{
			 try{
			 //获得图片的源始分辨率	 
			 int[] leng=getImageWidthAndHeight(path);
			 //页面参数转型
			 int result=Integer.parseInt(size);
			//构建一个设置缩略图对象
			ImageScale is = new ImageScale();
			//设置统缩略图大小
			BufferedImage image2 = is.imageZoomOut(image1,leng[0]/result,leng[1]/result);
			//缩略图传入页面
			ImageIO.write(image2, "JPEG", response.getOutputStream());
			 }catch(Exception e){
				 e.printStackTrace();
			 }
		}
		
		}
  
	//得到图片的源始分辨率
	public int[] getImageWidthAndHeight(String path) throws Exception{
		int[] leng=new int[2];
		InputStream is=new FileInputStream(path);
		BufferedImage src = javax.imageio.ImageIO.read(is); //构造Image对象
		int srcWidth = src.getWidth(null); //得到源图宽
		int srcHeight = src.getHeight(null); //得到源图长
 
		leng[0]=srcWidth;
		leng[1]=srcHeight;
		
 // System.out.print(srcWidth+"-"+srcHeight);
  
		return leng;
	}
}



ImageScale.java图片生成缩略图关键类

package org.img;

import java.awt.image.BufferedImage;

public class ImageScale {

	private int width;
	private int height;
	private int scaleWidth;
	double support = (double) 3.0;
	double PI = (double) 3.14159265358978;
	double[] contrib;
	double[] normContrib;
	double[] tmpContrib;
	int startContrib, stopContrib;
	int nDots;
	int nHalfDots;

	public BufferedImage imageZoomOut(BufferedImage srcBufferImage, int w, int h) {
	width = srcBufferImage.getWidth();
	height = srcBufferImage.getHeight();
	scaleWidth = w;

	if (DetermineResultSize(w, h) == 1) {
	return srcBufferImage;
	}
	CalContrib();
	BufferedImage pbOut = HorizontalFiltering(srcBufferImage, w);
	BufferedImage pbFinalOut = VerticalFiltering(pbOut, h);
	return pbFinalOut;
	}

	/**
	 * 决定图像尺寸
	 */
	private int DetermineResultSize(int w, int h) {
	double scaleH, scaleV;
	scaleH = (double) w / (double) width;
	scaleV = (double) h / (double) height;
	// 需要判断一下scaleH,scaleV,不做放大操作
	if (scaleH >= 1.0 && scaleV >= 1.0) {
	return 1;
	}
	return 0;

	} // end of DetermineResultSize()

	private double Lanczos(int i, int inWidth, int outWidth, double Support) {
	double x;

	x = (double) i * (double) outWidth / (double) inWidth;

	return Math.sin(x * PI) / (x * PI) * Math.sin(x * PI / Support)
	/ (x * PI / Support);

	} // end of Lanczos()

	//
	// Assumption: same horizontal and vertical scaling factor
	//
	private void CalContrib() {
	nHalfDots = (int) ((double) width * support / (double) scaleWidth);
	nDots = nHalfDots * 2 + 1;
	try {
	contrib = new double[nDots];
	normContrib = new double[nDots];
	tmpContrib = new double[nDots];
	} catch (Exception e) {
	System.out.println("init contrib,normContrib,tmpContrib" + e);
	}

	int center = nHalfDots;
	contrib[center] = 1.0;

	double weight = 0.0;
	int i = 0;
	for (i = 1; i <= center; i++) {
	contrib[center + i] = Lanczos(i, width, scaleWidth, support);
	weight += contrib[center + i];
	}

	for (i = center - 1; i >= 0; i--) {
	contrib[i] = contrib[center * 2 - i];
	}

	weight = weight * 2 + 1.0;

	for (i = 0; i <= center; i++) {
	normContrib[i] = contrib[i] / weight;
	}

	for (i = center + 1; i < nDots; i++) {
	normContrib[i] = normContrib[center * 2 - i];
	}
	} // end of CalContrib()

	// 处理边缘
	private void CalTempContrib(int start, int stop) {
	double weight = 0;

	int i = 0;
	for (i = start; i <= stop; i++) {
	weight += contrib[i];
	}

	for (i = start; i <= stop; i++) {
	tmpContrib[i] = contrib[i] / weight;
	}

	} // end of CalTempContrib()

	private int GetRedValue(int rgbValue) {
	int temp = rgbValue & 0x00ff0000;
	return temp >> 16;
	}

	private int GetGreenValue(int rgbValue) {
	int temp = rgbValue & 0x0000ff00;
	return temp >> 8;
	}

	private int GetBlueValue(int rgbValue) {
	return rgbValue & 0x000000ff;
	}

	private int ComRGB(int redValue, int greenValue, int blueValue) {

	return (redValue << 16) + (greenValue << 8) + blueValue;
	}

	// 行水平滤波
	private int HorizontalFilter(BufferedImage bufImg, int startX, int stopX,
	int start, int stop, int y, double[] pContrib) {
	double valueRed = 0.0;
	double valueGreen = 0.0;
	double valueBlue = 0.0;
	int valueRGB = 0;
	int i, j;

	for (i = startX, j = start; i <= stopX; i++, j++) {
	valueRGB = bufImg.getRGB(i, y);

	valueRed += GetRedValue(valueRGB) * pContrib[j];
	valueGreen += GetGreenValue(valueRGB) * pContrib[j];
	valueBlue += GetBlueValue(valueRGB) * pContrib[j];
	}

	valueRGB = ComRGB(Clip((int) valueRed), Clip((int) valueGreen),
	Clip((int) valueBlue));
	return valueRGB;

	} // end of HorizontalFilter()

	// 图片水平滤波
	private BufferedImage HorizontalFiltering(BufferedImage bufImage, int iOutW) {
	int dwInW = bufImage.getWidth();
	int dwInH = bufImage.getHeight();
	int value = 0;
	BufferedImage pbOut = new BufferedImage(iOutW, dwInH,
	BufferedImage.TYPE_INT_RGB);

	for (int x = 0; x < iOutW; x++) {

	int startX;
	int start;
	int X = (int) (((double) x) * ((double) dwInW) / ((double) iOutW) + 0.5);
	int y = 0;

	startX = X - nHalfDots;
	if (startX < 0) {
	startX = 0;
	start = nHalfDots - X;
	} else {
	start = 0;
	}

	int stop;
	int stopX = X + nHalfDots;
	if (stopX > (dwInW - 1)) {
	stopX = dwInW - 1;
	stop = nHalfDots + (dwInW - 1 - X);
	} else {
	stop = nHalfDots * 2;
	}

	if (start > 0 || stop < nDots - 1) {
	CalTempContrib(start, stop);
	for (y = 0; y < dwInH; y++) {
	value = HorizontalFilter(bufImage, startX, stopX, start,
	stop, y, tmpContrib);
	pbOut.setRGB(x, y, value);
	}
	} else {
	for (y = 0; y < dwInH; y++) {
	value = HorizontalFilter(bufImage, startX, stopX, start,
	stop, y, normContrib);
	pbOut.setRGB(x, y, value);
	}
	}
	}

	return pbOut;

	} // end of HorizontalFiltering()

	private int VerticalFilter(BufferedImage pbInImage, int startY, int stopY,
	int start, int stop, int x, double[] pContrib) {
	double valueRed = 0.0;
	double valueGreen = 0.0;
	double valueBlue = 0.0;
	int valueRGB = 0;
	int i, j;

	for (i = startY, j = start; i <= stopY; i++, j++) {
	valueRGB = pbInImage.getRGB(x, i);

	valueRed += GetRedValue(valueRGB) * pContrib[j];
	valueGreen += GetGreenValue(valueRGB) * pContrib[j];
	valueBlue += GetBlueValue(valueRGB) * pContrib[j];
	// System.out.println(valueRed+"->"+Clip((int)valueRed)+"<-");
	//
	// System.out.println(valueGreen+"->"+Clip((int)valueGreen)+"<-");
	// System.out.println(valueBlue+"->"+Clip((int)valueBlue)+"<-"+"-->");
	}

	valueRGB = ComRGB(Clip((int) valueRed), Clip((int) valueGreen),
	Clip((int) valueBlue));
	// System.out.println(valueRGB);
	return valueRGB;

	} // end of VerticalFilter()

	private BufferedImage VerticalFiltering(BufferedImage pbImage, int iOutH) {
	int iW = pbImage.getWidth();
	int iH = pbImage.getHeight();
	int value = 0;
	BufferedImage pbOut = new BufferedImage(iW, iOutH,
	BufferedImage.TYPE_INT_RGB);

	for (int y = 0; y < iOutH; y++) {

	int startY;
	int start;
	int Y = (int) (((double) y) * ((double) iH) / ((double) iOutH) + 0.5);

	startY = Y - nHalfDots;
	if (startY < 0) {
	startY = 0;
	start = nHalfDots - Y;
	} else {
	start = 0;
	}

	int stop;
	int stopY = Y + nHalfDots;
	if (stopY > (int) (iH - 1)) {
	stopY = iH - 1;
	stop = nHalfDots + (iH - 1 - Y);
	} else {
	stop = nHalfDots * 2;
	}

	if (start > 0 || stop < nDots - 1) {
	CalTempContrib(start, stop);
	for (int x = 0; x < iW; x++) {
	value = VerticalFilter(pbImage, startY, stopY, start, stop,
	x, tmpContrib);
	pbOut.setRGB(x, y, value);
	}
	} else {
	for (int x = 0; x < iW; x++) {
	value = VerticalFilter(pbImage, startY, stopY, start, stop,
	x, normContrib);
	pbOut.setRGB(x, y, value);
	}
	}

	}

	return pbOut;

	} // end of VerticalFiltering()

	int Clip(int x) {
	if (x < 0)
	return 0;
	if (x > 255)
	return 255;
	return x;
	}

}

分享到:
评论
1 楼 osacar 2010-09-12  
效果如何?性能?

相关推荐

Global site tag (gtag.js) - Google Analytics