Java相关

Java 将 PNG 图片转换成 JPG 图片

2022-01-26  本文已影响0人  思念_似水流年

在使用 driver 生成截图时文件格式是 PNG 格式,调用该方法获取到的手机头像占用空间大,通常生成的图片有几M,在页面显示时加载缓慢,影响页面显示效果,且浪费空间。如下图所示,图片显示比较慢,需要等待几秒才能加载完整图片:


lQLPDhsWhrbFcivNAb7NAciwpBBXOJELtf8B9ZSGQMC3AA_456_446.png

这里从两个方面进行优化:

  1. 将生成的头像由 PNG 格式转换成 JPG 格式,空间大大减小,图片显示速度比较快;
  2. Nginx 配置图片缓存。

这里着重讲解图片格式转换及压缩的相关代码。

ImageUtil 工具方法

package com.test.utils;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;

/**
 * add by sn
 */
public class ImageUtil {

    /**
     * 按照宽高比例压缩
     * @param img 图片
     * @param width 指定压缩的宽度
     * @param height    指定压缩的高度
     */
    public static void thumbnail_w_h(File img, int width, int height, OutputStream out) throws IOException {
        BufferedImage bi = ImageIO.read(img);
        double srcWidth = bi.getWidth();    // 源图宽度
        double srcHeight = bi.getHeight();  // 源图高度

        double scale = 1;

        // 压缩比例
        if (width > 0) {
            scale = width / srcWidth;
        }
        if (height > 0) {
            scale = height / srcHeight;
        }
        if (width > 0 && height > 0) {
            scale = height / srcHeight < width / srcWidth ? height / srcHeight : width / srcWidth;
        }

        thumbnail(img, (int) (srcWidth * scale), (int) (srcHeight * scale), out);
    }

    /**
     * 按照固定宽高原图压缩
     */
    public static void thumbnail(File img, int width, int height, OutputStream out) throws IOException {
        BufferedImage bi = ImageIO.read(img);
        Image image = bi.getScaledInstance(width, height, Image.SCALE_SMOOTH);

        BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics g = tag.getGraphics();
        g.setColor(Color.RED);
        g.drawImage(image, 0, 0, null); //绘制处理后的图
        g.dispose();
        ImageIO.write(tag, "JPG", out);
    }
}

调用压缩转换图片的代码

/**
     * 截屏并将图片由PNG压缩成JPG后上传到服务端
     * 仅手机初始化时的截屏图片进行此压缩操作
     */
    public UploadFile screenshotCompressAndUploadToServer() {
        File screenshotFile = screenshot();
        File imgFile = null;
        try {
            String fileName = screenshotFile.getAbsolutePath();
            String newName = fileName.replace("png", "jpg");
            // 截图生成的是PNG文件,压缩转换成JPG文件
            FileOutputStream fos = new FileOutputStream(newName);
            ImageUtil.thumbnail_w_h(screenshotFile, 0, 110, fos);
            fos.close();
            imgFile = new File(newName);
            return ServerClient.getInstance().uploadFile(imgFile, FileType.IMG);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        } finally {
            FileUtils.deleteQuietly(screenshotFile);
            if (imgFile.exists()) {
                FileUtils.deleteQuietly(imgFile);
            }
        }
    }

public File screenshot() {
        return driver.getScreenshotAs(OutputType.FILE);
    }

这里是指定了压缩的高度,用高度来确定压缩的比例,主要是因为图片在页面上显示时是固定高度的,因此采用了该比例。

压缩后生成的图片小了很多,只有几K,图片在页面上显示时速度也快了很多,如下图所示


image.png
上一篇 下一篇

猜你喜欢

热点阅读