zoukankan      html  css  js  c++  java
  • Java实现图片的压缩

    文章来源:http://www.jb51.net/article/82193.htm

    public class ImageHelper {
    	public static void main(String[] args) {
    		String sourceImagePath="D://2017-06-19_143951.png";
    		String destinationPath ="D://123.png";
    		ImageHelper helper = ImageHelper.getImageHelper();
    		helper.scaleImage(sourceImagePath, destinationPath, 1.2, "PNG");
    	}
    
    	private static ImageHelper imageHelper = null;
    
    	public static ImageHelper getImageHelper() {
    		if (imageHelper == null) {
    			imageHelper = new ImageHelper();
    		}
    		return imageHelper;
    	}
    
    	/***
    	 * 按指定的比例缩放图片
    	 * 
    	 * @param sourceImagePath
    	 *            源地址
    	 * @param destinationPath
    	 *            改变大小后图片的地址
    	 * @param scale
    	 *            缩放比例,如1.2 
    	 * @param format 
    	 *            图图片格式 例如 jpg
    	 */
    	public static void scaleImage(String sourceImagePath, String destinationPath, double scale, String format) {
    
    		File file = new File(sourceImagePath);
    		BufferedImage bufferedImage;
    		try {
    			bufferedImage = ImageIO.read(file);
    			int width = bufferedImage.getWidth();
    			int height = bufferedImage.getHeight();
    
    			width = parseDoubleToInt(width * scale);
    			height = parseDoubleToInt(height * scale);
    
    			Image image = bufferedImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
    			BufferedImage outputImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    			Graphics graphics = outputImage.getGraphics();
    			graphics.drawImage(image, 0, 0, null);
    			graphics.dispose();
    
    			ImageIO.write(outputImage, format, new File(destinationPath));
    		} catch (IOException e) {
    			System.out.println("scaleImage方法压缩图片时出错了");
    			e.printStackTrace();
    		}
    
    	}
    
    	/***
    	 * 将图片缩放到指定的高度或者宽度
    	 * 
    	 * @param sourceImagePath
    	 *            图片源地址
    	 * @param destinationPath
    	 *            压缩完图片的地址
    	 * @param width
    	 *            缩放后的宽度
    	 * @param height
    	 *            缩放后的高度
    	 * @param auto
    	 *            是否自动保持图片的原高宽比例
    	 * @param format
    	 *            图图片格式 例如 jpg
    	 */
    	public static void scaleImageWithParams(String sourceImagePath, String destinationPath, int width, int height,
    			boolean auto, String format) {
    
    		try {
    			File file = new File(sourceImagePath);
    			BufferedImage bufferedImage = null;
    			bufferedImage = ImageIO.read(file);
    			if (auto) {
    				ArrayList<Integer> paramsArrayList = getAutoWidthAndHeight(bufferedImage, width, height);
    				width = paramsArrayList.get(0);
    				height = paramsArrayList.get(1);
    				System.out.println("自动调整比例,width=" + width + " height=" + height);
    			}
    
    			Image image = bufferedImage.getScaledInstance(width, height, Image.SCALE_DEFAULT);
    			BufferedImage outputImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    			Graphics graphics = outputImage.getGraphics();
    			graphics.drawImage(image, 0, 0, null);
    			graphics.dispose();
    			ImageIO.write(outputImage, format, new File(destinationPath));
    		} catch (Exception e) {
    			System.out.println("scaleImageWithParams方法压缩图片时出错了");
    			e.printStackTrace();
    		}
    
    	}
    
    	/**
    	 * 将double类型的数据转换为int,四舍五入原则
    	 * 
    	 * @param sourceDouble
    	 * @return
    	 */
    	private static int parseDoubleToInt(double sourceDouble) {
    		int result = 0;
    		result = (int) sourceDouble;
    		return result;
    	}
    
    	/***
    	 * 
    	 * @param bufferedImage
    	 *            要缩放的图片对象
    	 * @param width_scale
    	 *            要缩放到的宽度
    	 * @param height_scale
    	 *            要缩放到的高度
    	 * @return 一个集合,第一个元素为宽度,第二个元素为高度
    	 */
    	private static ArrayList<Integer> getAutoWidthAndHeight(BufferedImage bufferedImage, int width_scale,
    			int height_scale) {
    		ArrayList<Integer> arrayList = new ArrayList<Integer>();
    		int width = bufferedImage.getWidth();
    		int height = bufferedImage.getHeight();
    		double scale_w = getDot2Decimal(width_scale, width);
    
    		System.out.println("getAutoWidthAndHeight width=" + width + "scale_w=" + scale_w);
    		double scale_h = getDot2Decimal(height_scale, height);
    		if (scale_w < scale_h) {
    			arrayList.add(parseDoubleToInt(scale_w * width));
    			arrayList.add(parseDoubleToInt(scale_w * height));
    		} else {
    			arrayList.add(parseDoubleToInt(scale_h * width));
    			arrayList.add(parseDoubleToInt(scale_h * height));
    		}
    		return arrayList;
    
    	}
    
    	/***
    	 * 返回两个数a/b的小数点后三位的表示
    	 * 
    	 * @param a
    	 * @param b
    	 * @return
    	 */
    	public static double getDot2Decimal(int a, int b) {
    
    		BigDecimal bigDecimal_1 = new BigDecimal(a);
    		BigDecimal bigDecimal_2 = new BigDecimal(b);
    		BigDecimal bigDecimal_result = bigDecimal_1.divide(bigDecimal_2, new MathContext(4));
    		Double double1 = new Double(bigDecimal_result.toString());
    		System.out.println("相除后的double为:" + double1);
    		return double1;
    	}
    
  • 相关阅读:
    Arrays类
    spring boot 整合ehcache
    自定义注解
    图像技术经典会议
    机器学习常见优化器
    TensorFlow学习笔记(一)
    Linux 下 jupyter安装
    学生、课程、分数关系的设计与实现 Hibernate
    Hibernate连接三种数据库的配置(SQL Server、Oracle、MySQL)
    Oracle11g服务详细介绍及哪些服务是必须开启的?
  • 原文地址:https://www.cnblogs.com/judylucky/p/7049460.html
Copyright © 2011-2022 走看看