Java图片压缩处理

网页中某些图片大的时候,图片会加载慢,这时候需要对图片进行压缩处理,Java有对图片进行压缩处理的方法。

整体思路:

  1. 页面中显示图片(输出流-->访问本地磁盘上的某张图片)
  2. 访问的时候动态选择是否想要压缩某张图片(压缩判断)
  3. 把原始图片复制一份,复制出来的那份给压缩,页面中想要压缩的图片时,就访问压缩后的图片,否则,则显示原图
复制一张图片,输出在原路径下,返回新复制后的路径,修改了原始文件名。
/**
     * 把一个大图片copy一份出来作为压缩处理
     * @param oldFile
     * @return
     */
    public static String  copyFile(String oldFile){
        String outPath = null;
        try {
            int bytesum = 0; 
            int byteread = 0; 
            File oldfile = new File(oldFile); 
            if (oldfile.exists()) { //文件存在时 
            InputStream inStream = new FileInputStream(oldFile); //读入原文件
            int prefix = oldfile.getName().lastIndexOf("."); //取得后缀名的开始位数
            String afterPrefix = oldfile.getName().substring(prefix, oldfile.getName().length()); //原始的文件名的后缀名
            System.out.println("后缀名是: "+afterPrefix);
            String beforePrefix = oldfile.getName().substring(0, prefix); //原始的文件名的前缀名
            System.out.println("前缀名是: "+beforePrefix);
            System.out.println(oldfile.getParentFile());
            System.out.println(oldfile.getParent());
            outPath = oldfile.getParentFile()+"/"+beforePrefix+"_copy"+afterPrefix;
            System.out.println("======>  "+outPath);
            //将复制的新图片重新命名
            FileOutputStream fs = new FileOutputStream(outPath); 
            byte[] buffer = new byte[1444]; 
            int length; 
            while ( (byteread = inStream.read(buffer)) != -1) { 
            bytesum += byteread; //字节数 文件大小 
            fs.write(buffer, 0, byteread); 
            } 
            inStream.close(); 
            }
        } catch (FileNotFoundException e) {
            System.out.println("图片没找到!");
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("复制图片出错!");
            e.printStackTrace();
        } 
        
        return outPath;
    }
把复制的出来的新图片进行压缩
/*** 
     * 功能 :按照正方形缩放图片,精度较高
     * 处理100X100或者别的
     * @param srcImgPath 原图片路径 
     * @param distImgPath  转换大小后图片路径 
     * @param width   转换后图片宽度 
     * @param height  转换后图片高度 
     */  
    public static void resizeImage(String srcImgPath, String distImgPath,int width, int height) throws IOException {  
        String subfix = "jpg";
        subfix = srcImgPath.substring(srcImgPath.lastIndexOf(".")+1,srcImgPath.length());
        File srcFile = new File(srcImgPath);  
        Image srcImg = ImageIO.read(srcFile);  
        BufferedImage buffImg = null; 
        if(subfix.equals("png") || subfix.equals("PNG")){
            buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        }else{
            buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        }
        Graphics2D graphics = buffImg.createGraphics();
        graphics.setBackground(Color.WHITE);
        graphics.setColor(Color.WHITE);
        graphics.fillRect(0, 0, width, height);
        graphics.drawImage(srcImg.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);  
        ImageIO.write(buffImg, subfix, new File(distImgPath));  
    }
图片访问输出流,加标识符是否需要对图片进行压缩处理
/**
     * 查看一个图片
     * @param proNo
     * @param fileName
     * @param response
     */
    @RequestMapping("/image/{proNo}/{fileName}/{true}")
    public void image(@PathVariable("proNo") String proNo,
            @PathVariable("fileName") String fileName,
            @PathVariable("true") boolean resize,
            HttpServletResponse response){
        FileInputStream fis = null;
        StringBuffer sb = new StringBuffer(20);
        try {
//          fis = new FileInputStream("D:/stt/products/1611070030000029/2016110700300002964329.png");
            String imgPath = StringBufferUtil.append(sb, ManagerConf.getMangerConf().getProductSave(),"/",proNo,"/",fileName).toString();
            if(!FileUtil.fileExists(imgPath)){
                return;
            }
            System.out.println(resize);
            if(resize){ //首页过来的请求,执行压缩程序
                System.out.println("原图片的路径:==========>" + imgPath);
                System.out.println("执行复制图片开始:....");
                String nowPath = copyFile(imgPath);
                System.out.println("执行复制图片结束:....");
                System.out.println("新复制图片的路径为:=======>" + nowPath);
                System.out.println("开始压缩图片程序:....");
                resizeImage(nowPath, nowPath, 100, 100);
                System.out.println("开始压缩图片结束:....");
                ServletOutputStream os = response.getOutputStream();
                
                fis = new FileInputStream(nowPath);
                byte[] bs = new byte[fis.available()];
                fis.read(bs);
                os.write(bs);
            }else{
                ServletOutputStream os = response.getOutputStream();
                fis = new FileInputStream(imgPath);
                byte[] bs = new byte[fis.available()];
                fis.read(bs);
                os.write(bs);
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                if(fis != null)fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
测试

这是URL最后标识符为true的时候,代表进行图片压缩。

压缩后

这是URL最后标识符为false的时候,图片未进行压缩处理。

压缩后

ok,到这里就完毕了。
我的博客文章地址:http://www.hanyz.cn/2017/06/28/Java%E5%9B%BE%E7%89%87%E5%8E%8B%E7%BC%A9%E5%A4%84%E7%90%86/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • @synthesize和@dynamic分别有什么作用?@property有两个对应的词,一个是 @synthes...
    笔笔请求阅读 508评论 0 1
  • 猜想runloop内部是如何实现的?一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。如果我们需要一...
    笔笔请求阅读 420评论 0 0
  • ¥开启¥ 【雷霆战机】 〖http://pan.baidu.com/s/1kVstszX〗 《解压源码后直接用AI...
    小菜c阅读 3,681评论 0 5
  • 从老公的库存盒子里,发现了这些邮票,他说是他四十年前的存货。 小时候帮着朋友集邮,他是这么把邮票从信封上泡下来的,...
    Lavendel阅读 231评论 0 2
  • 晨读易经第21-27卦,系辞上传第7-12章;孝经第1-7章;老子第68-75章。 身体发肤,受之父母,不敢毁伤,...
    平心平天下阅读 191评论 0 0