首页 > 编程语言 >java图片压缩

java图片压缩

时间:2024-04-02 23:30:35浏览次数:21  
标签:scale java int 压缩 bufferedImage param height width 图片


	  /*** 
	   * 按指定的比例缩放图片 
	   * 
	   * @param sourceImagePath 
	   *      源地址 
	   * @param destinationPath 
	   *      改变大小后图片的地址 
	   * @param scale 
	   *      缩放比例,如1.2 
	   */
	  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 
	   * image.SCALE_SMOOTH //平滑优先
		 image.SCALE_FAST//速度优先
		 image.SCALE_AREA_AVERAGING //区域均值
		 image.SCALE_REPLICATE //像素复制型缩放
		 image.SCALE_DEFAULT //默认缩放模式
	   */
	  public static boolean scaleImageWithParams(String sourceImagePath, 
	      String destinationPath, int width, int height, boolean auto,String format) { 
		  File file =null;
	    try { 
	     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_REPLICATE); 
	    BufferedImage outputImage = new BufferedImage(width, height, 
	        BufferedImage.SCALE_REPLICATE); 
	    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(); 
	      return false; 
	    }finally {
	    	if (file!=null&&file.exists()) {
	    		 file.delete();
			}
	    }
		return true; 
	      
	      
	  } 
	  
	  /** 
	   * 将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; 
	  } 

标签:scale,java,int,压缩,bufferedImage,param,height,width,图片
From: https://blog.csdn.net/a913222/article/details/137298723

相关文章

  • 2024年最新github之Javascript语言开源项目top50排行榜项目
    如果有帮助到您还请动动手帮忙点赞,关注,评论转发,感谢啦!......
  • javaweb学习(day11-监听器Listener&&过滤器Filter)
    一、监听器Listener1 Listener介绍Listener监听器它是JavaWeb的三大组件之一。JavaWeb的三大组件分别是:Servlet程序、Listener监听器、Filter过滤器Listener是JavaEE的规范,就是接口监听器的作用是,监听某种变化(一般就是对象创建/销毁,属性变化),触发对应方......
  • 瑞_Java所有相关环境及软件的安装和卸载_图文超详细(持续更新)
    文章目录JDK1.8资源准备各种可能的坑Windows环境卸载安装VMware虚拟机资源准备官方资源网盘资源安装步骤许可证检查安装是否成功LinuxCentOS7资源准备官方资源网盘资源卸载安装步骤MobaXterm(远程连接工具)资源准备官方资源网盘资源......
  • 简直了,被“Java并发锁”问题追问到自闭...
    故事地铁上,小帅双目空洞地望着窗外...绝望,发自内心地感到绝望...距离失业已经过去两个月了,这是小帅接到的第四次面试邀请。“回去等通知吧...”,简简单单的六个字,把小帅的心再次打入了冰窖。上次“【ThreadLocal问出花】”,小帅其实也有吸取教训得,这次对于多线程的问题还是做了......
  • Java 读取MacOS 本地的 rtf 文件内容:中英文皆可
    原是抄的大神的源码,东拼西凑的找了大半天,已忘记原链接了。特此声明⭐️本人不生产代码,只是代码的搬运工。 /***用换行符讲读取的整个文档内容截取成若干字符串*/publicstaticString[]interfacePath;//读取本地文件内容publicstaticvoidch......
  • 【知识点】Java代理实现方式
    Java代理的几种实现方式静态代理通过创建一个代理类来控制对目标对象的访问(也就是手动编写一个代理类)。静态代理的优点是易于理解和实现,缺点是每个接口都需要定义一个代理类,而且功能较弱。动态代理动态代理分两种,Proxy接口代理和CGLib代理接口代理Proxy代理是JDK内置代理......
  • Java基础
    Java标识符Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。关于Java标识符,有以下几点需要注意:所有的标识符都应该以字母(A-Z或者a-z),美元符($)、或者下划线(_)开始首字符之后可以是字母(A-Z或者a-z),美元符($)、下划线(_)或数字的任何字符组合关键字不......
  • JavaGUI实现文本转换、复制、顶置窗口等功能
    需求描述:实现对文本的处理,比如输入123输出('123')窗口顶置、取消顶置功能一键复制到剪切板源码实现packageJavaGUI;importjavax.swing.*;importjavax.swing.border.LineBorder;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.Actio......
  • java基础
    一、运算符     赋值运算符       =   +=  -=  *=  /=  %=  从右边往左执行     基本运算符       +   -   *   /  %     逻辑运算符       &  &&  ......
  • Java方法06:递归讲解
    递归1.A方法调用B方法,我们很容易理解!2.递归就是:A方法调用A方法!就是自己调用自己3.利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要......