java实现原生图片格式转换和自动图片压缩实现方案
有时候服务器上存储的图片占用空间较大,需要压缩上传的图片,这个巨大的工作量肯定要交给程序自动完成,特别是对那些采集程序、网络爬虫之类你懂得,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
*/
声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 嗅谱网
转载请注明:转自《java实现原生图片格式转换和自动图片压缩实现方案》
本文地址:http://www.xiupu.net/archives-7529.html
关注公众号:
微信赞赏
支付宝赞赏