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

输出结果:

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

相关推荐
用户40315986396632 分钟前
版本号升级统计
java·算法
RainbowSea19 分钟前
用户中心——比如:腾讯的QQ账号可以登录到很多应用当中 02
java·spring boot·mysql
RainbowSea25 分钟前
用户中心——比如:腾讯的QQ账号可以登录到很多应用当中 01
java·spring boot·mysql
超浪的晨32 分钟前
Java List 集合详解:从基础到实战,掌握 Java 列表操作全貌
java·开发语言·后端·学习·个人开发
超浪的晨37 分钟前
Java Set 集合详解:从基础语法到实战应用,彻底掌握去重与唯一性集合
java·开发语言·后端·学习·个人开发
liliangcsdn1 小时前
mac mlx大模型框架的安装和使用
java·前端·人工智能·python·macos
Shimiy1 小时前
第六章 面向对象编程------进阶
java
大葱白菜1 小时前
Java Set 集合详解:从基础语法到实战应用,彻底掌握去重与唯一性集合
java·后端
大葱白菜1 小时前
Java Map 集合详解:从基础语法到实战应用,彻底掌握键值对数据结构
java·后端
添乱1 小时前
「Java案例」判断是否是闰年的方法
java