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