java压缩处理Image图片

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">先说一下需求:【比如页面只能放600px大小的图片】</span>

         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;      
	}     

}



  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值