在使用 driver 生成截图时文件格式是 PNG 格式,调用该方法获取到的手机头像占用空间大,通常生成的图片有几M,在页面显示时加载缓慢,影响页面显示效果,且浪费空间。如下图所示,图片显示比较慢,需要等待几秒才能加载完整图片:
这里从两个方面进行优化:
- 将生成的头像由 PNG 格式转换成 JPG 格式,空间大大减小,图片显示速度比较快;
- 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,图片在页面上显示时速度也快了很多,如下图所示