Java生成缩略图遇到的问题

起因

最近遇到服务端生成缩略图,通过浏览器访问时无法查看缩略图的问题.

在浏览器中访问出现JFIF

Java生成小图,在浏览器中访问出现JFIF
最初项目的代码:
/**
    * 生成小图
    * @param fromFileStr   要生成小图的文件
    * @param saveToFileStr 生成的文件名
    * @param width         小图宽
    * @param hight         小图高
    * @throws IOException
    */
public void saveSmallImage(String fromFileStr, String saveToFileStr, int width, int hight) throws IOException {
    BufferedImage srcImage;
    File saveFile = new File(saveToFileStr);
    File fromFile = new File(fromFileStr);
    srcImage = ImageIO.read(fromFile);
    if (width > 0 || hight > 0) {
        srcImage = resize(srcImage, width, hight);
    }
    ImageIO.write(srcImage, "JPG", saveFile);
    srcImage.flush();
}

看到JPG这里是固定写死的代码,便进行了调整(根据文件扩展名):

/**
    * 生成小图
    * @param fromFileStr   要生成小图的文件
    * @param saveToFileStr 生成的文件名
    * @param width         小图宽
    * @param hight         小图高
    * @throws IOException
    */
public void saveSmallImage(String fromFileStr, String saveToFileStr, int width, int hight) throws IOException {
    BufferedImage srcImage;
    String fileExtName = saveToFileStr.substring(saveToFileStr.lastIndexOf('.') + 1).toLowerCase();
    File saveFile = new File(saveToFileStr);
    File fromFile = new File(fromFileStr);
    srcImage = ImageIO.read(fromFile);
    if (width > 0 || hight > 0) {
        srcImage = resize(srcImage, width, hight);
    }
    ImageIO.write(srcImage, fileExtName, saveFile);
}

因为生成之后,看生成的小图是可以用系统自带的画图工具打开的.便没有后续的测试.直到前两天在浏览器中发现无法查看.看到这个问题便觉得是生成缩略图不标准.

在用WinHex工具进行查看:

对比发现,生成缩略图是少信息的

将代码修改为这样是可以在浏览器查看的:

/**
    * 生成小图
    *
    * @param fromFileStr   要生成小图的文件
    * @param saveToFileStr 生成的文件名
    * @param width         小图宽
    * @param hight         小图高
    * @throws IOException
    */
public void saveSmallImage(String fromFileStr, String saveToFileStr, int width, int hight) throws IOException {
    BufferedImage srcImage;
    FileOutputStream outputStream = null;
    try {

        String fileExtName = saveToFileStr.substring(saveToFileStr.lastIndexOf('.') + 1).toLowerCase();
        File saveFile = new File(saveToFileStr);
        File fromFile = new File(fromFileStr);
        srcImage = ImageIO.read(fromFile);
        if (width > 0 || hight > 0) {
            srcImage = resize(srcImage, width, hight);
        }
        // 输出到文件流
        outputStream = new FileOutputStream(saveToFileStr);
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outputStream);
        JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(srcImage);
        // 压缩质量
        jep.setQuality(1f, true);
        //JPEG编码
        encoder.encode(srcImage, jep);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (outputStream != null) {
            outputStream.close();
        }
    }
}

这种方式在项目使用,还是有问题的.准备引入: thumbnailator 库

Maven中配置:

<!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
<dependency>
    <groupId>net.coobird</groupId>
    <artifactId>thumbnailator</artifactId>
    <version>0.4.11</version>
</dependency>
String filePath = "d:/test/1.bmp";
Thumbnails.of(filePath)
        .size(200, 300)
        .toFile("d:/test/1_small.bmp");
秋风 2020-03-15