zoukankan      html  css  js  c++  java
  • 图片压缩工具类

    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    
    import javax.imageio.ImageIO;
    
    /**
     * 
     * @author 彭锋
     * 2018年3月23日 下午3:15:10
     */
    public final class PicUtils {
    	/**
    	 * 判断要压缩的文件名是否是合法的图片文件
    	 * @param fileName
    	 * @return
    	 */
    	private static final boolean isImage(String fileName) {
    		if(fileName == null || fileName.isEmpty()) {
    			throw new RuntimeException("要判断的文件名不能为空!");
    		}
    		fileName = fileName.toUpperCase();
    		return fileName.endsWith(".JPG") || fileName.endsWith(".JPEG") ||
    				fileName.endsWith(".PNG") || fileName.endsWith(".BMP") ||  fileName.endsWith(".GIF");
    	}
    	/**
    	 * 读取文件,返回Image对象
    	 * @param srcFile	要压缩的原始文件的文件路径
    	 * @return
    	 * @throws IOException
    	 */
    	private static final Image readImage(String srcFile) throws IOException {
    		if(!isImage(srcFile)) {
    			throw new RuntimeException("要压缩的文件的后缀名必须是jpg、jpeg、png、bmp或者gif!");
    		}
    		File _file = new File(srcFile);
    		if(!_file.exists() || _file.isDirectory()) {
    			throw new RuntimeException("要压缩文件必须存在!");
    		}
    		return javax.imageio.ImageIO.read(_file);
    	}
    	/**
    	 * 根据指定的宽和高缩放图片,并将缩放后的图片输出到目标文件
    	 * @param img		读取到的原始文件
    	 * @param destFile	目标文件
    	 * @param width		缩放后的宽
    	 * @param height	缩放后的高
    	 * @throws IOException
    	 */
    	private static final void resize(Image img,File destFile,int width,int height ) throws IOException {
    		//获取图片缓冲区(画布)
    		BufferedImage _image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    		//获取压缩后的图片内容
    		/*
    		 * 这种压缩方法,压缩后的文件体积更小,平滑度更好,但所花时间是下面那种方法的三四倍
    		img = img.getScaledInstance(width, height, Image.SCALE_SMOOTH);
    		_image.getGraphics().drawImage(img, 0, 0,null); 
    		*/
    		// 向图片缓冲区中绘制缩小后的图
    		_image.getGraphics().drawImage(img, 0, 0, width, height, null); 
    		//将图片缓冲区输出到指定文件中
    		String fileName = destFile.getName();
    		ImageIO.write(_image, fileName.substring(fileName.lastIndexOf(".")+1).toUpperCase(), destFile);
    	}
    	/**
    	 * 强制压缩/放大图片到固定的大小
    	 * @param srcFile	要压缩的原始文件的文件路径
    	 * @param destFile	压缩后的文件
    	 * @param width		压缩后的图片的宽
    	 * @param height	压缩后的图片的高
    	 * @throws IOException
    	 */
    	public static final void resize(String srcFile,File destFile,int width,int height) throws IOException {
    		resize(readImage(srcFile),destFile,width,height);
    	}
    	/**
    	 *  按照固定的比例缩放图片
    	 * @param srcFile
    	 * @param destFile
    	 * @param t
    	 * @throws IOException
    	 */
    	public static final void resize(String srcFile,File destFile,double t) throws IOException {
    		Image img = readImage(srcFile);
    		resize(img,destFile,(int) (img.getWidth(null) * t),(int) (img.getHeight(null) * t));
    	}
    	/**
    	 * 以宽度为基准,等比例放缩图片
    	 * @param srcFile	要压缩的原始文件的文件路径
    	 * @param destFile	压缩后的文件
    	 * @param width		压缩后的图片的宽
    	 * @throws IOException
    	 */
    	public static final void resizeByWidth(String srcFile,File destFile,int width) throws IOException {
    		Image img = readImage(srcFile);
    		int h = img.getHeight(null); // 得到源图高
    		int w = img.getWidth(null); // 得到源图宽
    		double nh = 1.0*h*width/ w;//根据原图的宽获取缩放比例
    		resize(img,destFile, width,(int) nh);
    	}
    	/**
    	 * 以高度为基准,等比例缩放图片
    	 * @param srcFile	要压缩的原始文件的文件路径
    	 * @param destFile	压缩后的文件
    	 * @param height	压缩后的图片的宽
    	 * @throws IOException
    	 */
    	public static final void resizeByHeight(String srcFile,File destFile,int height) throws IOException {
    		Image img = readImage(srcFile);
    		int h = img.getHeight(null); // 得到源图高
    		int w = img.getWidth(null); // 得到源图宽
    		double nw = 1.0*w*height / h;// 计算等比缩放后的宽
    		resize(img,destFile,(int) nw, height);
    	}
    }
    

      

  • 相关阅读:
    Oracle 服务命名(别名)的配置及原理,plsql连接用
    AdHoc发布时出现重复Provisioning Profile的解决方案
    xcode5时代如何设置Architectures和Valid Architectures
    C# WinForm 导出导入Excel/Doc 完整实例教程[使用Aspose.Cells.dll]
    DataTable的数据批量写入数据库
    高中生活--第7篇–我为什么不交作业
    ITFriend网站内测公测感悟
    网站推广第一周总结和反思
    第一次当面试官
    技术人才的出路在哪里,5种选择和2种思路
  • 原文地址:https://www.cnblogs.com/pf1988/p/8630494.html
Copyright © 2011-2022 走看看