• java关于图片处理修改图片大小


    最近做了一个关于图片浏览的内容。因为图片都是一些证件的资料的扫描件所以比较大,对系统的影响也是非常之大的,有很大可能直接把系统干死。那么我是这么处理的,给大家分享一下。如果大家有好的方案的话一定要早点告诉我。

    需求简单介绍:

    上传文件是压缩包,但是到查看资料的时候压缩包可下载本地看,同时也可以在系统中直接在线浏览。

    设计方案

      

      

    1 营业部用户上传图片文件压缩包文件到综合业务系统tomcat服务器,系统在tomcat服务器将压缩文件解压到系统临时目录。

    2 系统分析解压的图片文件(文件名上有分类和序号),按照分类和顺序将文件名存入到数据库表中。存入数据库的文件名带有路径。

    3 将解压的文件和压缩包按照规定的路径上传到FTP服务器中。

    4 FTP服务器同时是一台tomcat服务器,图片的目录在tomcat服务器的webapps目录下。

    5 图片的路径命名方式:

         webapps/imageserver/年(如2014)/月(如05)/日(如19)/16位唯一随机码/压缩包和解压文件

    6 信审部查看图片文件和下载压缩包时,直接通过URL访问。

    7 文件服务器不另外设置权限访问控制,所有访问控制通过16位唯一随机码控制,只有知道了16位唯一随机码,才能访问到图片文件和压缩包。

    8 为了保证访问速度,单个图片文件最好控制在1M一下(我们可以推荐用户使用较低分辨率的扫描文件)。

    9 如果图片访问量较大,需要购买硬件来升级文件服务器,例如采用NAS存储,升级带宽等。

    实现步骤:

      1:上传压缩包:解压到本地临时目录,检测图片大小修改图片大小,上传到ftp。

      2:读取对应的的数据进行浏览。

    这些相信大家都会,我下面贴出一个修改图片大小的工具类,方便我自己记忆,如果对大家有帮助也可以参考。

    这个图片处理机制效率实在太慢,6个图片4-5秒,查了很多试了很多也没找到合适方法,暂且就用这个吧。如果有好的方法还望大家多多指教。

    package com.minxinloan.black.web.utils;
    
    import java.awt.Graphics;
    import java.awt.Image;  
    import java.awt.image.BufferedImage;  
    import java.io.File;  
    import java.io.FileOutputStream;  
    import java.io.IOException;
      
    import javax.imageio.ImageIO;  
    
    import org.apache.log4j.Logger;
    //  
    import com.sun.image.codec.jpeg.JPEGCodec;  
    import com.sun.image.codec.jpeg.JPEGImageEncoder;  
    //
    //import com.sun.media.jai.codecimpl.JPEGCodec;
    //import com.sun.media.jai.codecimpl.JPEGImageEncoder;
      
    
    
    
    public class ImagesUtils {  
      
        private final static Logger log = Logger.getLogger(ImagesUtils.class);    
        //图片允许的最大大小
        public static final int IMAGEMAXSIZE = 1024*1024;
        // 图片宽和高的最大尺寸  
        public static final int IMAGEMAXBIG = 2000;  
        // 图片宽和高的最小尺寸  
        public static final int IMAGEMINBIG = 10;  
        // 按原图大小生成新图  
        public static final int CREATENEWIMAGETYPE_0 = 0;  
        // 按指定的大小生成新图  
        public static final int CREATENEWIMAGETYPE_1 = 1;  
        // 按原图宽高比例生成新图-按指定的宽度  
        public static final int CREATENEWIMAGETYPE_2 = 2;  
        // 按原图宽高比例生成新图-按指定的高度  
        public static final int CREATENEWIMAGETYPE_3 = 3;  
        // 按原图宽高比例生成新图-按指定的宽和高中较大的尺寸  
        public static final int CREATENEWIMAGETYPE_4 = 4;  
        // 按原图宽高比例生成新图-按指定的宽和高中较小的尺寸  
        public static final int CREATENEWIMAGETYPE_5 = 5;  
        // 按原图宽高比例生成新图-按原图大小的90%进行修改 
        public static final int CREATENEWIMAGETYPE_6 = 6;
      
        /** 
         *  
         * @param _file 
         *            原图片 
         * @param createType 
         *            处理类型 
         * @param newW 
         *            新宽度 
         * @param newH 
         *            新高度 
         * @return 
         * @throws Exception 
         */  
        public static String createNewImage(File _file, int createType, int newW,  
                int newH) throws Exception {  
            if (_file == null)  
                return null;  
            String fileName = _file.getPath();  
            if (fileName == null || "".equals(fileName)  
                    || fileName.lastIndexOf(".") == -1)  
                return null;  
            /* 
             * else newFileName = "_" + newFileName; 
             */  
      
            String outFileName = fileName.substring(0, fileName.lastIndexOf(".")) 
                    + fileName.substring(fileName.lastIndexOf("."), fileName  
                            .length());  
            String fileExtName = fileName.substring(  
                    (fileName.lastIndexOf(".") + 1), fileName.length());  
            if (newW < IMAGEMINBIG)  
                newW = IMAGEMINBIG;  
            else if (newW > IMAGEMAXBIG)  
                newW = IMAGEMAXBIG;  
      
            if (newH < IMAGEMINBIG)  
                newH = IMAGEMINBIG;  
            else if (newH > IMAGEMAXBIG)  
                newH = IMAGEMAXBIG;  
      
            // 得到原图信息  
            if (!_file.exists() || !_file.isAbsolute() || !_file.isFile()  
                    || !checkImageFile(fileExtName))  
                return null;  
            Image src = ImageIO.read(_file);  
            int w = src.getWidth(null);  
            int h = src.getHeight(null);  
      
            // 确定目标图片的大小  
            int nw = w;  
            int nh = h;  
            if (createType == CREATENEWIMAGETYPE_0)  
                ;  
            else if (createType == CREATENEWIMAGETYPE_1) {  
                nw = newW;  
                nh = newH;  
            } else if (createType == CREATENEWIMAGETYPE_2) {  
                nw = newW;  
                nh = (int) ((double) h / (double) w * nw);  
            } else if (createType == CREATENEWIMAGETYPE_3) {  
                nh = newH;  
                nw = (int) ((double) w / (double) h * nh);  
            } else if (createType == CREATENEWIMAGETYPE_4) {  
                if ((double) w / (double) h >= (double) newW / (double) newH) {  
                    nh = newH;  
                    nw = (int) ((double) w / (double) h * nh);  
                } else {  
                    nw = newW;  
                    nh = (int) ((double) h / (double) w * nw);  
                }  
            } else if (createType == CREATENEWIMAGETYPE_5) {  
                if ((double) w / (double) h <= (double) newW / (double) newH) {  
                    nh = newH;  
                    nw = (int) ((double) w / (double) h * nh);  
                } else {  
                    nw = newW;  
                    nh = (int) ((double) h / (double) w * nw);  
                }  
            } else if(createType == CREATENEWIMAGETYPE_6){
    //            nw = (int)(w*0.5);  
    //            nh = (int)(h*0.5); 
                double proportion = (double)1700/(double)w;
                nw = (int)((double)w*proportion);
                nh = (int)((double)h*proportion);
            } 
      
            // 构造目标图片  
            BufferedImage tag = new BufferedImage(nw, nh,  
                    BufferedImage.TYPE_INT_RGB);  
      
            // 得到目标图片输出流  
            FileOutputStream out = new FileOutputStream(outFileName);  
      
            // 根据需求画出目标图片 方式1  
            tag.getGraphics().drawImage(src, 0, 0, nw, nh, null);  
      
            // 将画好的目标图输出到输出流 方式1  
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);  
            encoder.encode(tag);  
            out.close();  
            return outFileName;  
        }  
      
        public static boolean checkImageFile(String extName) {  
      
            if ("jpg".equalsIgnoreCase(extName))  
                return true;  
            if ("gif".equalsIgnoreCase(extName))  
                return true;  
            if ("bmp".equalsIgnoreCase(extName))  
                return true;  
            if ("jpeg".equalsIgnoreCase(extName))  
                return true;  
            if ("png".equalsIgnoreCase(extName))  
                return true;  
            return false;  
        }  
        public static String checkImageFile2(String extName) {  
              
            if ("jpg".equalsIgnoreCase(extName))  
                return "jpg";  
            if ("gif".equalsIgnoreCase(extName))  
                return "gif";  
            if ("bmp".equalsIgnoreCase(extName))  
                return "bmp";  
            if ("jpeg".equalsIgnoreCase(extName))  
                return "jpeg";  
            if ("png".equalsIgnoreCase(extName))  
                return "jpeg";  
            return null;  
        }  
       
        
        //递归修改图片大小
        public static void changeImgSize(String filePath,int createType)
        {
            try {
                File tempFile = new File(filePath);
                if(tempFile.length()>IMAGEMAXSIZE){
                    System.out.println("sss");
                    changeImgSize(createNewImage(tempFile, createType, 0, 0),createType);
                }
            } catch (Exception e) {
                log.error("the changeImgSize is failed . the message is "+e.getMessage());
            }
        }
        /**
         * 缩放图像(按比例缩放)
         * @param srcImageFile 源图像文件地址
         * @param result 缩放后的图像地址
         * @param scale 缩放比例
         * @param flag 缩放选择:true 放大; false 缩小;
         */
        public final static void scale(String srcImageFile,String type, String result) {
            try {
                
                File tempFile = new File(srcImageFile);
                if(tempFile.length()>IMAGEMAXSIZE){
                    System.out.println("sss");
                    BufferedImage src = ImageIO.read(tempFile); // 读入文件
                    int width = src.getWidth(); // 得到源图宽
                    int height = src.getHeight(); // 得到源图长
                    
                    double sc = (double)1700/(double)width;
                    
                 
                    width = (int)((double)width * sc);
                    height = (int)((double)height * sc);
                  
                    Image image = src.getScaledInstance(width, height,
                            Image.SCALE_DEFAULT);
                    BufferedImage tag = new BufferedImage(width, height,
                            BufferedImage.TYPE_INT_RGB);
                    Graphics g = tag.getGraphics();
                    g.drawImage(image, 0, 0, null); // 绘制缩小后的图
                    g.dispose();
                    ImageIO.write(tag, type, new File(result));// 输出到文件流
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        
        public static void changeImgSize(File file)
         {
             try {
                    // 判断文件是否是文件,如果是文件,获取路径,并计数
                    if (file.isFile()) {
                        String fileExtName = file.getName().substring(  
                                (file.getName().lastIndexOf(".") + 1), file.getName().length());  
                        
                        String temp = ImagesUtils.checkImageFile2(fileExtName);
                        if(temp!=null)
                            //scale(file.getAbsolutePath(),temp,file.getAbsolutePath());
                            ImagesUtils.changeImgSize(file.getAbsolutePath(), ImagesUtils.CREATENEWIMAGETYPE_6);
                    } else {
                        // 如果是文件夹,声明一个数组放文件夹和他的子文件
                        File[] f = file.listFiles();
                        // 遍历文件件下的文件,并获取路径
                        for (File file2 : f) {
                            changeImgSize(file2);
                        }
                    }
                } catch (RuntimeException e) {
                    e.printStackTrace();
                }
         }
      
        public static void main(String[] args) {
            
    
            
            
    //
    //        long start=System.currentTimeMillis();
    //        String filePath = "C:\Users\zhangmi\Desktop\资料";
    //        changeImgSize(new File(filePath));
    //
    //        long end=System.currentTimeMillis();
    //        //在最好的一行加上:
    //        System.out.println("执行耗时 : "+(end-start)/1000f+" 秒 ");
            
        }
    }  

    做已铭记

  • 相关阅读:
    NS网络仿真,小白起步版,双节点之间的模拟仿真(基于UDP和CBR流)
    Linux学习,ACL权限管理
    SQL中的注释语句
    C#连接SQL Server数据库小贴士
    C#重写ToString
    C#控制台应用程序之选课系统
    浅谈C、C++及其区别、兼容与不兼容
    C++之客户消费积分管理系统
    A*算法
    HTML标签列表总览
  • 原文地址:https://www.cnblogs.com/puqiuxiaomao/p/java.html
Copyright © 2020-2023  润新知