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

输出结果:

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

相关推荐
.豆鲨包10 分钟前
【Android】深入理解Activity的生命周期和IntentFilter
android·java
lkbhua莱克瓦2418 分钟前
集合进阶6——TreeMap底层原理
java·开发语言·笔记·学习方法·hashmap
JEECG低代码平台22 分钟前
GitHub 十大 Java 语言 AI 开源项目推荐
java·人工智能·github
小咖张25 分钟前
idea 启动失败,不加载自己的配置文件
java·ide·intellij-idea
m***119033 分钟前
使用IDEA环境编译Spring源码及spring源码调试环境搭建
java·spring·intellij-idea
代码程序猿RIP1 小时前
【C++开发面经】全过程面试问题详解
java·c++·面试
whatever who cares1 小时前
Java/Android中BigDecimal的相关操作
android·java·开发语言
烤麻辣烫1 小时前
黑马程序员苍穹外卖(新手) DAY3
java·开发语言·spring boot·学习·intellij-idea
妮妮喔妮1 小时前
JAVA反射的介绍(优缺点)
java·开发语言
i***48611 小时前
Redis重大版本整理(Redis2.6-Redis7.0)
java·数据库·redis