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

输出结果:

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

相关推荐
天河归来17 分钟前
springboot框架redis开启管道批量写入数据
java·spring boot·redis
张先shen25 分钟前
Elasticsearch RESTful API入门:全文搜索实战
java·大数据·elasticsearch·搜索引擎·全文检索·restful
codervibe26 分钟前
如何用 Spring Security 构建无状态权限控制系统(含角色菜单控制)
java·后端
codervibe29 分钟前
项目中如何用策略模式实现多角色登录解耦?(附实战代码)
java·后端
TCChzp31 分钟前
synchronized全链路解析:从字节码到JVM内核的锁实现与升级策略
java·jvm
大葱白菜33 分钟前
🧩 Java 枚举详解:从基础到实战,掌握类型安全与优雅设计
java·程序员
笑衬人心。35 分钟前
在 Mac 上安装 Java 和 IntelliJ IDEA(完整笔记)
java·macos·intellij-idea
SimonKing42 分钟前
颠覆传统IO:零拷贝技术如何重塑Java高性能编程?
java·后端·程序员
sniper_fandc1 小时前
SpringBoot系列—MyBatis(xml使用)
java·spring boot·mybatis
胚芽鞘6811 小时前
查询依赖冲突工具maven Helper
java·数据库·maven