文章图片标题

java实现原生图片格式转换和自动图片压缩实现方案

分类:架构设计 作者:阳光倾城 评论:0 点击: 479 次 日期:2016-07-09

有时候服务器上存储的图片占用空间较大,需要压缩上传的图片,这个巨大的工作量肯定要交给程序自动完成,特别是对那些采集程序、网络爬虫之类你懂得,Jdk提供了图片处理的原生支持,下面给出一个实例,用于udast智能机器人的爬虫程序。

package com.tomrrow.collect.util;

import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

/**
* 非常牛逼的一个jdk原生图片格式转换实现,png2jpg
* @author xujy
*
*/
public class ImgConverter {    
    public static boolean convert(String source, String formatName, String result, String resultrelease, boolean delsource) {
        File f = null;
        BufferedImage src  = null;
        File nf = null;
        try {
            f = new File(source);
            if (f.canRead()) throw new RuntimeException("对图片无读写权限"+f.getName()); // 无权限
            src = ImageIO.read(f);
            nf = new File(result);
            ImageIO.write(src, formatName, nf); 
            // 为了保证释放上一文件!!!
            src = ImageIO.read(f);
            nf = new File(resultrelease);
            ImageIO.write(src, formatName, nf); 
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally{
            if (delsource){
                f.delete();
            }
            if (src!=null)
            src = null;
            if (f!=null)
            f = null;
            nf.delete();
        }
    }
}

 

上面的代码是格式转换,只有png转成jpg,才能利用Linux平台的压缩工具jpegoptim压缩图片。

package com.tomrrow.collect.util;

import java.io.File;

import org.apache.log4j.Logger;

public class Jpegoptim {
    private static Logger log = Logger.getLogger(Jpegoptim.class);
    public static void jpegotim(String currfilepath, long targetSize) {
        if (currfilepath == null || "".equals(currfilepath)){
            log.error("图片路径为空");
            return ;
        }
        File f = new File(currfilepath);
        if (f.isDirectory()){
            log.error("不是文件");
            return;
        }
        if (!f.canRead()){
            log.error("文件不存在或没有读权限");
            return;
        }
        long currSize = f.length();
        Jpegoptim.imgCompz(currfilepath, currSize, targetSize);
    }
    /**
     * 压缩指定图片到设定的大小(有损压缩)
     * @param currfilepath 绝对路径
     * @param currSize 实际字节数
     * @param targetSize 目标字节数
     */
    protected static void imgCompz(String currfilepath,long currSize, long targetSize){
        if (targetSize == 0)
            targetSize = 1;// 单位是byte
        long per = 100l - targetSize * 100l / currSize;
        if (per <= 0l) // 小于压缩目标字节数,没必要压缩
            return;
        String command = "jpegoptim -m"+ per + " " + currfilepath;
        boolean flag = false;
        try{
            flag = Shell.execShell(command);
        } catch (Exception e){log.error(e);}
        if (flag)
        log.info("成功压缩:"+currfilepath);
        else
            log.info("压缩失败:"+currfilepath);
    }   
}

/*
无损压缩jpeg图像

为了无损地压缩一副JPG图片,使用:
1.$ jpegoptim photo.jpg
2.photo.jpg 2048x153624bit N ICC JFIF [OK]882178-->821064 bytes (6.93%), optimized.

注意,原始图像会被压缩后图像覆盖。

如果jpegoptim不能无损美化图像,将不会覆盖它:
1.$ jpegoptim -v photo.jpg
2.photo.jpg 2048x153624bit N ICC JFIF [OK]821064-->821064 bytes (0.00%), skipped.

如果你想保护原始图片,使用"-d"参数指明保存目录
1.$ jpegoptim -d ./compressed photo.jpg

这样,压缩的图片将会保存在./compressed目录(以同样的输入文件名)

如果你想要保护文件的创建修改时间,使用"-p"参数。这样压缩后的图片会得到与原始图片相同的日期时间。
1.$ jpegoptim -d ./compressed -p photo.jpg

如果你只是想看看无损压缩率而不是真的想压缩它们,使用"-n"参数来模拟压缩,然后它会显示出压缩率。
1.$ jpegoptim -n photo.jpg

有损压缩JPG图像

万一你真的需要要保存在云空间上,你还可以使用有损压缩JPG图片。

这种情况下,使用"-m<质量>"选项,质量数范围0到100。(0是最好质量,100是最差质量)

例如,用50%质量压缩图片:
1.$ jpegoptim -m50 photo.jpg
2.photo.jpg 2048x153624bit N ICC JFIF [OK]882178-->301780 bytes (65.79%), optimized.

在牺牲质量的基础上,将会得到一个更小的图片。

一次压缩多张JPEG图像

最常见的情况是需要压缩一个目录下的多张JPEG图像文件。为了应付这种情况,你可以使用接下来的脚本。
#!/bin/sh
# 压缩当前目录下所有*.jpg文件
# 保存在./compressed目录
# 并拥有与原始文件同样的修改日期
for i in*.jpg;do jpegoptim -d ./compressed -p "$i";done

*/




声明: 除非注明,本文属( 阳光倾城 )原创,转载请保留链接: http://www.tomrrow.com/archives-7529.html