将以下数学公式的图片使用Hutool提供的图片工具类改变尺寸
代码如下:
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");
}
}
输出结果:
输出的照片是我们指定的尺寸大小,但图片是一片漆黑。
原因在于修改了图片的尺寸后,默认会把背景改成黑色,而原来公式的字体颜色就是黑色,所以会一片黑。
问题解决:
我们可以自己写一个修改图片尺寸的方法,代码如下:
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);
}
输出结果:
图片内容是有了,但有没有发现,图片变得很模糊,有点看不清字符的形状。问题在于修改了尺寸后,没有对他进行平滑处理。
最能体现这个问题的一张图片就是如下图:
原图:
修改尺寸后:
字都看不清了,那肯定是不行的。
解决方法:
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);
}
输出结果:
修改完尺寸后的图片比较符合预期,尺寸是对的,清晰度也是能看得清每一个字,效果很好。