Java图片压缩及解决遇到压缩时出现黑底的问题
在项目中有个需求是将图片和其他文件合并,最后输出为一个文件,我在大佬们的帮助下找到合适的压缩工具类来实现压缩,并做如下总结:
方案一
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图片压缩及解决遇到压缩时出现黑底的问题相关推荐
- 解决java 图片压缩图片图片变色问题
最近有人遇到在处理在用Java进行图片压缩的时候,压缩后图片的背景色发生了变色,如图所示: 压缩前: 压缩后: 经查阅相关资料后发现可以用阿里巴巴的SImpleImage可以解决这个问题. 主要依赖以 ...
- 使用java实现多种方式解决图片压缩的问题
前段时间在使用对图片加水印后,由于需加水印的图片的宽度和高度都非常的大,加了水印后图片从几百KB,变成了几MB,严重影响了图片在页面的加载速度! 经过仔细的琢磨,决定先对图片进行压缩,再加水印.采用这 ...
- java 图片压缩不改变分辨率
转载:java 图片压缩不改变分辨率java压缩图片大小不改变图片分辨率_僵尸吃过跳跳糖的博客-CSDN博客_java 压缩图片分辨率 package com.cjn.util;import org. ...
- [Java]图片压缩
Java中内置的压缩图片有两种方式: 通过Image的getScaledInstance方法将图片尺寸进行压缩,它的压缩策略有: SCALE_DEFAULT 默认图像缩放算法 SCALE_FAST 缩 ...
- java实现图片分辨率压缩、图片软化、jpg质量压缩
最近遇见个需求,需要压缩图片,但是很多涉及到的方法类,要么对jdk依赖比较大,要么对系统的配置有要求,经过几天的研究和测试,终于整了一个还算比较全的方案. 代码 注解1:关于根据url读取图片的方法有 ...
- java图片上传压缩处理
过去做的项目都是针对企业级应用,第一次开发新闻版块图片上传的功能,需要解决用户上传图片后,按照用户规定的尺寸大小或者按照图片比例,对图片进行压缩. 自己试写的工具类,写的时候考虑了几个关键点: 1.图 ...
- java压缩图片比例quality_Java实现的上传并压缩图片功能【可等比例压缩或原尺寸压缩】...
本文实例讲述了java实现的上传并压缩图片功能.分享给大家供大家参考,具体如下: 先看效果: 原图:1.33M 处理后:27.4kb 关键代码: package codeGenerate.util; ...
- java 图片压缩 图片添加水印 thumbnailator javafx
应用截图 启动界面 添加图片 处理结果 项目地址 图片压缩: java 图片压缩 图片添加水印 thumbnailator javafx pom.xml <?xml version=" ...
- java图片的导出,并压缩
java图片的导出,并压缩 java 压缩包jar包使用的是commons-compress-1.6.jar /*** 导出图片* @param request* @param response*/@ ...
最新文章
- ZABBIX安装官方指南
- Discuz!论坛,如何查看全站最新帖子列表?
- N个数中选择M个数的组合(1MN)
- Angular的工作原理
- 如何在PowerPoint中自动调整图片大小
- Linux上的js解码,使用JavaScript实现Base64编码与解码
- 通过transmittable-thread-local源码理解线程池线程本地变量传递的原理
- jQuery 的一个自动向上翻页的效果
- 什么是flowable
- iis5.1安装方法(适用于XP)以及运行调试asp程序,创建虚拟目录【整理】
- oracle sql语句中有关null使用的一点理解
- wait,notify,notifyAll用法解析
- iOS音乐播放器相关
- python黑帽子怎么样_PYTHON 黑帽子第二章总结
- 开心消消乐分析与设计
- 如何快速辨识四位数字贴片电阻阻值
- 黑色星期五 问题描述 有些西方人比较迷信,如果某个月的13号正好是星期五,他们就会觉得不太吉利,用古人的说法,就是“诸事不宜”。请你编写一个程序,统计出在某个特定的年份中,出现了多少次既是13号又
- Chrome扩展框架-Vue项目(用vue配合webpack实现浏览器扩展,包含热更新,无需重复加载浏览器插件)
- Introduce myself
- 【mysql】--explain命令解析