zoukankan      html  css  js  c++  java
  • 图片服务器图片剪切处理

    背景:摄像头抓拍的图片,高清之类的,图片比较大,可能几百KB之类的,在展示的时候,往往只是展示缩略图,只有点击图片之后才会展示高清图,

    直接在tomcat中添加拦截器,对图片请求进行过滤,来实现图片处理服务。

    PictureFilter.java

    package myweb;
    
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import javax.imageio.ImageIO;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    
    public class PictureFilter implements Filter{
    
        private Pattern p = Pattern.compile("h_([0-9]*),w_([0-9]*)");
        
        @Override
        public void destroy() {}
    
        @Override
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
                throws IOException, ServletException {
            
            HttpServletRequest request = (HttpServletRequest) req;
            String queryStr = request.getQueryString();
            String uri = request.getRequestURI();
            if(isEmpty(queryStr)) {
                chain.doFilter(req, resp);
            }else {
                try {
                    String picLocalPath = request.getSession().getServletContext().getRealPath(uri);
                    String x_oss_process = request.getParameter("x-oss-process");
                    imageResize(picLocalPath, resp.getOutputStream(), x_oss_process);
                } catch (Exception e) {
                    e.printStackTrace();
                    chain.doFilter(req, resp);
                }
            }
        }
        
        /**
         * 
         * @param picLocalPath
         * @param output
         * @param paramters 格式"image/resize,m_fill,h_100,w_200"
         */
        private void imageResize(String picLocalPath,OutputStream output,String x_oss_process) throws Exception{
            // 解析x_oss_process参数
            Matcher m = p.matcher(x_oss_process);
            boolean b = m.find();
            if(!b){
                return;
            }
            int h = Integer.parseInt(m.group(1));
            int w = Integer.parseInt(m.group(2));
            
            InputStream input = new FileInputStream(picLocalPath);
            BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = (Graphics2D) image.getGraphics();
            BufferedImage img = ImageIO.read(input);
            g.drawImage(img, 0, 0, w, h, null);
            input.close();
            String format = getSuffix(picLocalPath);
            ImageIO.write(image, format, output);
        }
        
        private String getSuffix(String str) {
            int index = str.lastIndexOf(".");
            if(index < 0) {
                return null;
            }
            return str.substring(index+1);
        }
        
        @Override
        public void init(FilterConfig conf) throws ServletException {}
        
        
        private boolean isEmpty(String str) {
            if(str==null || str.trim().length()==0) {
                return true;
            }
            return false;
        }
        
    }

    web.xml中添加

        <filter>
            <filter-name>pictureFilter</filter-name>
            <filter-class>myweb.PictureFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>pictureFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>

    想要多大多小,自己参数设置就可以了。

    说明:这样做,对服务器的压力之类的没有测试过,这个对服务器的cpu肯定消耗变高了,对网络带宽的要求降低了,这里针对每一张图片每一次请求如果设置的处理参数相同,都进行了图片处理,没有进行缓存处理。可以考虑缓存来存放已经处理过一次的图片,定期清理缓存。

    使用:将编译后的class文件直接放入tomcat对应的classes目录下面,在server.xml中添加过滤器配置,就可以生效。

  • 相关阅读:
    观察者模式
    strchr
    行转列
    Ja.Net:融合 Java 1.5 和 .NET !
    主题:借JavaFX之风,Swing终于熬到了出头之日
    DOM和SAX概念的总结
    几个linux的命令技巧
    gcc编译的东东
    详细介绍DOM和SAX
    oracle的number类型默认长度是多少?
  • 原文地址:https://www.cnblogs.com/TheoryDance/p/12566627.html
Copyright © 2011-2022 走看看