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);
    }

输出结果:

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

相关推荐
荣码3 小时前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
plainGeekDev5 小时前
Gson → kotlinx.serialization
android·java·kotlin
小bo波13 小时前
Java Swing 图形用户界面实验 —— 从算术练习到游戏开发的完整实践
java·课程设计·gui·游戏开发·扫雷·swing
咖啡八杯15 小时前
GoF设计模式——备忘录模式
java·后端·spring·设计模式
SamDeepThinking1 天前
裁掉那个差程序员后,给你看团队里高手的代码:这个习惯,希望你有
java·后端·程序员
朕瞧着你甚好1 天前
技术雷达 & Java 集成评估报告 — Apache Tika 3.3.1
java·ai编程
MacroZheng1 天前
短短几天,暴涨2.8万Star!又一款编程神器开源!
java·人工智能·后端
SamDeepThinking1 天前
函数式编程:用BiFunction消除多类型分支的代码重复
java·后端·面试