在项目中有个需求是将图片和其他文件合并,最后输出为一个文件,我在大佬们的帮助下找到合适的压缩工具类来实现压缩,并做如下总结:

方案一

package com.example.cn.service;import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import lombok.extern.slf4j.Slf4j;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.math.MathContext;
import java.util.ArrayList;@Slf4j
public class ImageHelper {  /**** 将图片缩放到指定的高度或者宽度* @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);}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) {log.error("压缩图片出现未知错误!", e);}}
}

方案二


package com.hand.hcf.app.expense.pdf.util;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;public class ImageUtil {public static boolean compressPic(String srcFilePath, String descFilePath) throws IOException {File file = null;BufferedImage src = null;FileOutputStream out = null;ImageWriter imgWrier;ImageWriteParam imgWriteParams;// 指定写图片的方式为 jpgimgWrier = ImageIO.getImageWritersByFormatName("jpg").next();imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam(null);// 要使用压缩,必须指定压缩方式为MODE_EXPLICITimgWriteParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);// 这里指定压缩的程度,参数qality是取值0~1范围内,imgWriteParams.setCompressionQuality((float) 1);imgWriteParams.setProgressiveMode(ImageWriteParam.MODE_DISABLED);// ColorModel colorModel =ImageIO.read(new File(srcFilePath)).getColorModel();//ColorModel colorModel =ColorModel.getRGBdefault();// 指定压缩时使用的色彩模式imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier(colorModel, colorModel.createCompatibleSampleModel(16, 16)));imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier(colorModel, colorModel.createCompatibleSampleModel(16, 16)));try {if (isBlank(srcFilePath)) {return false;} else {file = new File(srcFilePath);System.out.println(file.length());src = ImageIO.read(file);int width = src.getWidth();int height = src.getHeight();out = new FileOutputStream(descFilePath);imgWrier.reset();// 必须先指定 out值,才能调用write方法, ImageOutputStream可以通过任何// OutputStream构造imgWrier.setOutput(ImageIO.createImageOutputStream(out));// 调用write方法,就可以向输入流写图片int w=(int)width;int h=(int)height;imgWrier.write(null, new IIOImage(src, null, null),imgWriteParams);out.flush();out.close();}} catch (Exception e) {e.printStackTrace();return false;}return true;}public static boolean isBlank(String string) {if (string == null || string.length() == 0 || string.trim().equals("")) {return true;}return false;}
}

效果展示:

如果在压缩过程中出现如上黑底的情况,指定压缩的图片类型,需要添加如下代码:

指定fillReact(0,0,w,h),把图片重新draw一次,黑底问题解决。

 BufferedImage image = new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB );image.getGraphics().fillRect( 0, 0 , w, h);image.getGraphics().drawImage(src, 0, 0, w, h, null);

效果如下:

附上解决黑底的完整代码:


package com.hand.hcf.app.expense.pdf.util;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;public class ImageUtil {public static boolean compressPic(String srcFilePath, String descFilePath) throws IOException {File file = null;BufferedImage src = null;FileOutputStream out = null;ImageWriter imgWrier;ImageWriteParam imgWriteParams;// 指定写图片的方式为 jpgimgWrier = ImageIO.getImageWritersByFormatName("jpg").next();imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam(null);// 要使用压缩,必须指定压缩方式为MODE_EXPLICITimgWriteParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);// 这里指定压缩的程度,参数qality是取值0~1范围内,imgWriteParams.setCompressionQuality((float) 1);imgWriteParams.setProgressiveMode(ImageWriteParam.MODE_DISABLED);// ColorModel colorModel =ImageIO.read(new File(srcFilePath)).getColorModel();//ColorModel colorModel =ColorModel.getRGBdefault();// 指定压缩时使用的色彩模式imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier(colorModel, colorModel.createCompatibleSampleModel(16, 16)));imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier(colorModel, colorModel.createCompatibleSampleModel(16, 16)));try {if (isBlank(srcFilePath)) {return false;} else {file = new File(srcFilePath);System.out.println(file.length());src = ImageIO.read(file);int width = src.getWidth();int height = src.getHeight();out = new FileOutputStream(descFilePath);imgWrier.reset();// 必须先指定 out值,才能调用write方法, ImageOutputStream可以通过任何// OutputStream构造imgWrier.setOutput(ImageIO.createImageOutputStream(out));// 调用write方法,就可以向输入流写图片int w=(int)width;int h=(int)height;BufferedImage image = new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB );image.getGraphics().fillRect( 0, 0 , w, h);image.getGraphics().drawImage(src, 0, 0, w, h, null);imgWrier.write(null, new IIOImage(image, null, null),imgWriteParams);out.flush();out.close();}} catch (Exception e) {e.printStackTrace();return false;}return true;}public static boolean isBlank(String string) {if (string == null || string.length() == 0 || string.trim().equals("")) {return true;}return false;}
}

如果还不能解决黑底问题,请尝试更改imageType类型。

 public BufferedImage(int width,int height,int imageType);

参考博客:

https://blog.csdn.net/u012081441/article/details/80419145

https://blog.csdn.net/monitor1394/article/details/6087583

Java图片压缩及解决遇到压缩时出现黑底的问题相关推荐

  1. 解决java 图片压缩图片图片变色问题

    最近有人遇到在处理在用Java进行图片压缩的时候,压缩后图片的背景色发生了变色,如图所示: 压缩前: 压缩后: 经查阅相关资料后发现可以用阿里巴巴的SImpleImage可以解决这个问题. 主要依赖以 ...

  2. 使用java实现多种方式解决图片压缩的问题

    前段时间在使用对图片加水印后,由于需加水印的图片的宽度和高度都非常的大,加了水印后图片从几百KB,变成了几MB,严重影响了图片在页面的加载速度! 经过仔细的琢磨,决定先对图片进行压缩,再加水印.采用这 ...

  3. java 图片压缩不改变分辨率

    转载:java 图片压缩不改变分辨率java压缩图片大小不改变图片分辨率_僵尸吃过跳跳糖的博客-CSDN博客_java 压缩图片分辨率 package com.cjn.util;import org. ...

  4. [Java]图片压缩

    Java中内置的压缩图片有两种方式: 通过Image的getScaledInstance方法将图片尺寸进行压缩,它的压缩策略有: SCALE_DEFAULT 默认图像缩放算法 SCALE_FAST 缩 ...

  5. java实现图片分辨率压缩、图片软化、jpg质量压缩

    最近遇见个需求,需要压缩图片,但是很多涉及到的方法类,要么对jdk依赖比较大,要么对系统的配置有要求,经过几天的研究和测试,终于整了一个还算比较全的方案. 代码 注解1:关于根据url读取图片的方法有 ...

  6. java图片上传压缩处理

    过去做的项目都是针对企业级应用,第一次开发新闻版块图片上传的功能,需要解决用户上传图片后,按照用户规定的尺寸大小或者按照图片比例,对图片进行压缩. 自己试写的工具类,写的时候考虑了几个关键点: 1.图 ...

  7. java压缩图片比例quality_Java实现的上传并压缩图片功能【可等比例压缩或原尺寸压缩】...

    本文实例讲述了java实现的上传并压缩图片功能.分享给大家供大家参考,具体如下: 先看效果: 原图:1.33M 处理后:27.4kb 关键代码: package codeGenerate.util; ...

  8. java 图片压缩 图片添加水印 thumbnailator javafx

    应用截图 启动界面 添加图片 处理结果 项目地址 图片压缩: java 图片压缩 图片添加水印 thumbnailator javafx pom.xml <?xml version=" ...

  9. java图片的导出,并压缩

    java图片的导出,并压缩 java 压缩包jar包使用的是commons-compress-1.6.jar /*** 导出图片* @param request* @param response*/@ ...

最新文章

  1. ZABBIX安装官方指南
  2. Discuz!论坛,如何查看全站最新帖子列表?
  3. N个数中选择M个数的组合(1MN)
  4. Angular的工作原理
  5. 如何在PowerPoint中自动调整图片大小
  6. Linux上的js解码,使用JavaScript实现Base64编码与解码
  7. 通过transmittable-thread-local源码理解线程池线程本地变量传递的原理
  8. jQuery 的一个自动向上翻页的效果
  9. 什么是flowable
  10. iis5.1安装方法(适用于XP)以及运行调试asp程序,创建虚拟目录【整理】
  11. oracle sql语句中有关null使用的一点理解
  12. wait,notify,notifyAll用法解析
  13. iOS音乐播放器相关
  14. python黑帽子怎么样_PYTHON 黑帽子第二章总结
  15. 开心消消乐分析与设计
  16. 如何快速辨识四位数字贴片电阻阻值
  17. 黑色星期五 问题描述   有些西方人比较迷信,如果某个月的13号正好是星期五,他们就会觉得不太吉利,用古人的说法,就是“诸事不宜”。请你编写一个程序,统计出在某个特定的年份中,出现了多少次既是13号又
  18. Chrome扩展框架-Vue项目(用vue配合webpack实现浏览器扩展,包含热更新,无需重复加载浏览器插件)
  19. Introduce myself
  20. 【mysql】--explain命令解析

热门文章

  1. Windows命令行关闭IE代理
  2. android googleplay 支付接入
  3. Java学习必备书籍推荐终极版!
  4. SAP相对其他erp软件的优势
  5. 前端面试总结(转载请标明)
  6. Jenkins Bitbucket Vue 部署
  7. 百度地图自定义吹出框
  8. Codeforces 786 A. Berzerk
  9. 如何打开mcp为后缀的文档(昆仑通态 人机界面HMI,配合PLC)
  10. MoM(五)解矩阵方程