java 生成缩略图 JavaJSPJ#ServletjQuery
程序员文章站
2022-03-08 11:37:51
...
前台页面index.jsp
wed.xml
ImageServlet.java
ImageScale.java图片生成缩略图关键类
<%@ 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">«</span><span id="span_auto"></span><span id="span_next">»</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">»</span><span id="this_next">«</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; } }
上一篇: Two Sum - LeetCode题解
下一篇: Android下拉框带图片