java解决修改图片尺寸,压缩图片后出现背景变黑,图片字体模糊问题

将以下数学公式的图片使用Hutool提供的图片工具类改变尺寸

代码如下:

java 复制代码
package com.jason.common.file.word;

import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.io.FileUtil;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.HashMap;
import java.util.Map;

public class Test {
    public static void main(String[] args) {
        BufferedInputStream inputStream1 = FileUtil.getInputStream("E:\\图片\\Picture2.png");
        ByteArrayOutputStream outputStream1 = new ByteArrayOutputStream(1024);
        ImgUtil.scale(inputStream1, outputStream1, 200, 50, null);
        FileUtil.writeBytes(outputStream1.toByteArray(), "E:\\图片\\newPicture2.png");
    }
}

输出结果:

输出的照片是我们指定的尺寸大小,但图片是一片漆黑。

原因在于修改了图片的尺寸后,默认会把背景改成黑色,而原来公式的字体颜色就是黑色,所以会一片黑。

问题解决:

我们可以自己写一个修改图片尺寸的方法,代码如下:

java 复制代码
  
    private void resizeImage(InputStream inputStream, OutputStream outputStream, int targetWidth, int targetHeight) throws IOException {
        BufferedImage to = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = to.createGraphics();
        
        // 重要配置Transparency.TRANSLUCENT,指定透明度为半透明
        to = g2d.getDeviceConfiguration().createCompatibleImage(targetWidth, targetHeight, Transparency.TRANSLUCENT);
        
        g2d.dispose();
        g2d = to.createGraphics();
        BufferedImage bi2 = ImageIO.read(inputStream);
        Image from = bi2.getScaledInstance(targetWidth, targetHeight, Image.SCALE_DEFAULT);
        g2d.drawImage(from, 0, 0, null);
        g2d.dispose();
        ImageIO.write(to, "png", outputStream);
    }
    

输出结果:

图片内容是有了,但有没有发现,图片变得很模糊,有点看不清字符的形状。问题在于修改了尺寸后,没有对他进行平滑处理。

最能体现这个问题的一张图片就是如下图:

原图:

修改尺寸后:

字都看不清了,那肯定是不行的。

解决方法:

java 复制代码
 private static void resizeImage(InputStream inputStream, OutputStream outputStream, int targetWidth, int targetHeight) throws IOException {
        BufferedImage to = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = to.createGraphics();
        // 重要配置Transparency.TRANSLUCENT,指定透明度为半透明
        to = g2d.getDeviceConfiguration().createCompatibleImage(targetWidth, targetHeight, Transparency.TRANSLUCENT);
        g2d.dispose();
        g2d = to.createGraphics();
        BufferedImage bi2 = ImageIO.read(inputStream);
        
        // 重要配置Image.SCALE_SMOOTH,配置缩放平滑度
        Image from = bi2.getScaledInstance(targetWidth, targetHeight, Image.SCALE_SMOOTH);
        
        g2d.drawImage(from, 0, 0, null);
        g2d.dispose();
        ImageIO.write(to, "png", outputStream);
    }

输出结果:

修改完尺寸后的图片比较符合预期,尺寸是对的,清晰度也是能看得清每一个字,效果很好。

相关推荐
一弓虽几秒前
SpringBoot 学习
java·spring boot·后端·学习
南客先生4 分钟前
互联网大厂Java面试:RocketMQ、RabbitMQ与Kafka的深度解析
java·面试·kafka·rabbitmq·rocketmq·消息中间件
ai大佬7 分钟前
Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合
java·spring·自动化·api中转·apikey
Mr__Miss32 分钟前
面试踩过的坑
java·开发语言
爱喝一杯白开水34 分钟前
POI从入门到上手(一)-轻松完成Apache POI使用,完成Excel导入导出.
java·poi
向哆哆1 小时前
Java 安全:如何防止 DDoS 攻击?
java·安全·ddos
啥都想学的又啥都不会的研究生1 小时前
Kubernetes in action-初相识
java·docker·微服务·容器·kubernetes·etcd·kubelet
毅航1 小时前
MyBatis 事务管理:一文掌握Mybatis事务管理核心逻辑
java·后端·mybatis
宝耶2 小时前
面试常问问题:Java基础篇
java·面试·职场和发展
躲在云朵里`2 小时前
IDEA搭建环境的五种方式
java·ide·intellij-idea