先说一下需求:【比如页面只能放600px大小的图片】
1、在使用CMS编辑文章的时候,有时候图片很大,把页面撑开了。此时就想将图片压缩。
2、在压缩的时候,宽,高都使用相同的比例压缩,怎么获取到图片的高宽。
以下代码解决以上的问题
BufferedImage image = ImageUtil.getBufferedHttpImage(image_URL); //使用ImageUtil获取到图片的高宽
FileCompress compress = new FileCompress();
float scale = ((float)image.getWidth() )/ 600; //计算出宽压缩到600px时,压缩的多少倍
int imageHeight = (int) (image.getHeight() / scale); //同样将高也压缩这个多倍(以免图片失真)
compress.Tosmallerpic(new File(url), new File(url), 600, imageHeight, 0.75f); //使用Tosmallerpic将图片按照比例压缩
ImageUtil的代码
package com.gdcn.core.helper;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import org.apache.commons.lang.StringUtils;
public class ImageUtil {
/**
* @param args
*/
public static void main(String[] args) {
String imageUrl="http://avatar.csdn.net/9/F/2/1_5iasp.jpg";
BufferedImage image=getBufferedImage(imageUrl);
if (image!=null) {
System.out.println("图片高度:"+image.getHeight());
System.out.println("图片宽度:"+image.getWidth());
} else {
System.out.println("图片不存在!");
}
}
/**
* 通过图片链接获取
* @param imgUrl 图片地址
* @return
*/
public static BufferedImage getBufferedImage(String imgUrl) {
URL url = null;
InputStream is = null;
BufferedImage img = null;
try {
url = new URL(imgUrl);
is = url.openStream();
img = ImageIO.read(is);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return img;
}
/**
* 文件
* @param imgUrl
* @return
* @author liu787427876@126.com
* @date 2014-7-20
*/
public static BufferedImage getBufferedImageByLocal(File file) {
InputStream is = null;
BufferedImage img = null;
try {
is = new FileInputStream(file);
img = ImageIO.read(is);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return img;
}
public static BufferedImage getBufferedImageByLocal(String imgUrl) {
if(StringUtils.isBlank(imgUrl)){
throw new NullPointerException("图片路径不能为空!");
}
File file = new File(imgUrl);
return getBufferedImageByLocal(file);
}
}
FileCompress的代码
package com.gdcn.core.helper;
import java.awt.Container;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.log4j.Logger;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public class FileCompress {
Logger logger=Logger.getLogger(FileCompress.class);
/**
*
* @param f 图片输出路径
* @param filelist 图片路径
* @param ext 缩略图扩展名
* @param n 图片名
* @param w 目标宽
* @param h 目标高
* @param per 百分比
*/
public void Tosmallerpic(File oldFile,File newFile,int width,int height,float quality){
if(!newFile.getParentFile().exists()){
newFile.getParentFile().mkdirs();
}
Image src=null;
BufferedImage tag=null;
FileOutputStream newimage=null;
try {
try{
src = javax.imageio.ImageIO.read(oldFile); //构造Image对象
}catch(Exception e){
e.printStackTrace();
logger.info(oldFile.getName()+"图片的ICC信息可能已经被破坏开始转换:");
try {
ThumbnailConvert convert=new ThumbnailConvert();
//convert.setCMYK_COMMAND(oldFile.getPath());
String CMYK_COMMAND = "mogrify -colorspace RGB -quality 100 file1";//转换cmyk格式
convert.exeCommand(CMYK_COMMAND.replace("file1",oldFile.getPath()));
src = Toolkit.getDefaultToolkit().getImage(oldFile.getPath());
MediaTracker mediaTracker = new MediaTracker(new Container());
mediaTracker.addImage(src, 0);
mediaTracker.waitForID(0);
src.getWidth(null);
src.getHeight(null);
}catch (Exception e1){
e1.printStackTrace();
}
}
//,String ext 保留字段 缩略图拼接字段
//String img_midname=newFile;
int old_w=src.getWidth(null)==-1?width:src.getWidth(null); //得到源图宽
int old_h=src.getHeight(null)==-1?height:src.getHeight(null);
int new_w=0;
int new_h=0; //得到源图长
double w2=(old_w*1.00)/(width*1.00);
double h2=(old_h*1.00)/(height*1.00);
//图片调整为方形结束
if(old_w>width)
new_w=(int)Math.round(old_w/w2);
else
new_w=old_w;
if(old_h>height)
new_h=(int)Math.round(old_h/h2);//计算新图长宽
else
new_h=old_h;
tag = new BufferedImage(new_w,new_h,BufferedImage.TYPE_INT_RGB);
//tag.getGraphics().drawImage(src,0,0,new_w,new_h,null); //绘制缩小后的图
tag.getGraphics().drawImage(src.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0,0,null);
newimage=new FileOutputStream(newFile); //输出到文件流
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);
JPEGEncodeParam jep=JPEGCodec.getDefaultJPEGEncodeParam(tag);
/* 压缩质量 */
jep.setQuality(quality, true);
encoder.encode(tag, jep);
//encoder.encode(tag); //近JPEG编码
newimage.close();
} catch (IOException ex) {
ex.printStackTrace();
logger.info(oldFile.getName()+"图片压缩问题;"+ex);
//Logger.getLogger(File:mpress.class.getName()).log(Level.SEVERE, null, ex);
}finally{
if(newimage!=null){
try {
newimage.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(tag!=null){
tag.flush();
}
}
}
public static void main(String[] args) {
String oldpath="D:\\20120918052939765.jpg";
String newpath="D:\\000.jpg";
FileCompress ddd=new FileCompress();
ddd.Tosmallerpic(new File(oldpath),new File(newpath), 300, 200, 1f);
}
}
贴代码的时候忘记了一个类,现在补上。
ThumbnailConvert类
package com.gdcn.core.helper;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
public class ThumbnailConvert {
private static String CMYK_COMMAND = "mogrify -colorspace RGB -quality 80 file1";//转换cmyk格式
public static void setCMYK_COMMAND(String file1) {
exeCommand(CMYK_COMMAND.replace("file1", file1));
}
public static boolean exeCommand(String cmd){
InputStreamReader ir = null;
LineNumberReader input = null;
try
{
//linux下java执行指令:Runtime.getRuntime().exec (String str);
Process process = Runtime.getRuntime().exec (cmd);
ir=new InputStreamReader(process.getInputStream());
input = new LineNumberReader (ir);
while ((input.readLine ()) != null){
}
ir.close();
input.close();
}
catch (IOException e){
e.printStackTrace();
return false;
}
return true;
}
}