欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java 生成缩略图 JavaJSPJ#ServletjQuery 

程序员文章站 2022-03-08 11:37:51
...
前台页面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;
	}

}