Java裁剪压缩PNG图片,透明背景色变黑的解决方案
作者:新成同学 发布时间:2023-11-25 13:21:27
标签:Java,PNG图片,背景色,变黑
Java裁剪压缩PNG图片,透明背景色变黑
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
/**
* 图片工具类
*/
public class ImageUtil {
/**
* 裁剪PNG图片工具类
*
* @param fromFile
* 源文件
* @param toFile
* 裁剪后的文件
* @param outputWidth
* 裁剪宽度
* @param outputHeight
* 裁剪高度
* @param proportion
* 是否是等比缩放
*/
public static void resizePng(File fromFile, File toFile, int outputWidth, int outputHeight,
boolean proportion) {
try {
BufferedImage bi2 = ImageIO.read(fromFile);
int newWidth;
int newHeight;
// 判断是否是等比缩放
if (proportion) {
// 为等比缩放计算输出的图片宽度及高度
double rate1 = ((double) bi2.getWidth(null)) / (double) outputWidth + 0.1;
double rate2 = ((double) bi2.getHeight(null)) / (double) outputHeight + 0.1;
// 根据缩放比率大的进行缩放控制
double rate = rate1 < rate2 ? rate1 : rate2;
newWidth = (int) (((double) bi2.getWidth(null)) / rate);
newHeight = (int) (((double) bi2.getHeight(null)) / rate);
} else {
newWidth = outputWidth; // 输出的图片宽度
newHeight = outputHeight; // 输出的图片高度
}
BufferedImage to = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = to.createGraphics();
to = g2d.getDeviceConfiguration().createCompatibleImage(newWidth, newHeight,
Transparency.TRANSLUCENT);
g2d.dispose();
g2d = to.createGraphics();
@SuppressWarnings("static-access")
Image from = bi2.getScaledInstance(newWidth, newHeight, bi2.SCALE_AREA_AVERAGING);
g2d.drawImage(from, 0, 0, null);
g2d.dispose();
ImageIO.write(to, "png", toFile);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 测试
*/
public static void main(String[] args) throws Exception {
File fromFile = new File("c:/wxcking/pic/D77E37CB.png");
File toFile = new File("c:/wxcking/pic/D77E37CB_thumb.png");
resizePng(fromFile, toFile, 100, 100, false);
}
}
java ImageIO.write图片上传变色及背景变黑
public void getImage(HttpServletRequest request, HttpServletResponse response) throws Exception {
response.setDateHeader("Expires", 0);
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache");
response.setContentType("image/jpeg");
String uri = request.getRequestURI();
String imgPath = uri.replace("/ofc/rest/img", "");
File image = new File(imgPath);
BufferedImage bi = ImageIO.read(image);
BufferedImage newBi = resizeImagePng(bi.getWidth(), bi.getHeight(),bi);
Graphics2D g2d = newBi.createGraphics();
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 1.0f));
ServletOutputStream out = response.getOutputStream();
g2d.drawImage(newBi,0,0,null);
ImageIO.write(newBi,"png", out);
//ImageIO.write(bi, "jpg", out);
//saveAs(bi,"jpg", out);
}
public static BufferedImage resizeImagePng(int x, int y, BufferedImage bfi) {
BufferedImage bufferedImage = new BufferedImage(x, y, BufferedImage.TYPE_INT_ARGB);
bufferedImage.getGraphics().drawImage(
bfi.getScaledInstance(x, y, Image.SCALE_SMOOTH), 0, 0, null);
return bufferedImage;
}
public static void saveAs(BufferedImage image, String formatName, ServletOutputStream outFile) throws IOException {
if (formatName.equalsIgnoreCase("jpg") || formatName.equalsIgnoreCase("jpeg")) {
BufferedImage tag = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_BGR);
Graphics g = tag.getGraphics();
// Graphics2D gg=tag.createGraphics();
// tag = gg.getDeviceConfiguration().createCompatibleImage(image.getWidth(), image.getHeight(),Transparency.TRANSLUCENT);
// gg.dispose();
// gg = tag.createGraphics();
// gg.drawImage(image, 0, 0,null);
g.drawImage(image, 0, 0,image.getWidth(), image.getHeight(),image.getGraphics().getColor(), null); // 绘制缩小后的图
g.dispose();
image = tag;
}
ImageIO.write(image, formatName, outFile);
}
来源:https://blog.csdn.net/ya2dan/article/details/49802279


猜你喜欢
- 关闭时可使用如下代码public static void waitUntilTerminate(final ExecutorService
- 1.查询后获取对应的数据集后,传递参数strcodeName,根据数据集中strcodeName的匹配对应字段,获取数据集中对应的目的字段p
- 环境搭建创建Maven项目。pom.xml文件中引入RocketMQ依赖。<dependencies>  
- 一、项目运行环境配置:Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe
- jar文件包括java普通类、资源文件和普通文件,在maven中即是打包src/main/java和src/main/resources资源
- 一、带时区的时间1.获取当前时间对象(带时区)import java.time.ZonedDateTime;public class dem
- 注:若是为了解决问题,可直接查看第二部分。1.安装与启动在下载安装前,请安装好JDK并配置好环境变量。ActiveMQ可到官网下载。点击进入
- 一、使用方式可以采用Transactional,配置propagation即可。打开org.springframework.transact
- 以下这段C#代码实现的功能是在屏幕上画图的效果!具体代码如下://DllImport所在的名字空间 using System.Ru
- 调用示例: 执行效果: 2.实现代码:/// <summary> 2 &
- 使用代码特别注意 :拼接条件时,所使用到的条件strID,strBir必须是独立的var predicate = PredicateBuil
- 前言这里用swing ,awt写的。我们大概要做成一个电脑的记事本那样的一个编辑器。可以调整字体,字号,颜色。能够打开、保存文件,新建窗口,
- C#异常处理总结及简单实例一、异常处理的理解?异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常。因此处理这种错误,
- 上一篇文章: # Android 10 启动分析之Zygote篇 (三)紧接着上一篇文章的内容,我们从这篇文章开始来分析一下 SystemS
- 近期工作内容需要涉及到相机开发,其中一个功能点就是实现一个相机预览页底部的滑动指示器,现在整理出来供大家讨论参考。先上一张图看下效果:主要实
- 1:HttpHelper.javapublic class HttpHelper { //1:标准的Ja
- 异常算术异常类:ArithmeticExecption空指针异常类:NullPointerException类型强制转换异常:ClassCa
- jQuery的方法连缀使用起来非常方便,可以简化语句,让代码变得清晰简洁。那C#的类方法能不能也实现类似的功能呢?基于这样的疑惑,研究了一下
- Java对自动登陆功能的简单实现,仅用到了servlet和一个filter。第一次写博文,如有不足的地方,敬请指正,谢谢。登陆界面<%
- SpringBoot版本:2.3.2.RELEASESpringBoot Data JPA版本:2.3.2.RELEASEJpaReposi