起因
最近遇到服务端生成缩略图,通过浏览器访问时无法查看缩略图的问题.
在浏览器中访问出现JFIF
最初项目的代码:
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这里是固定写死的代码,便进行了调整(根据文件扩展名):
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工具进行查看:
将代码修改为这样是可以在浏览器查看的:
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);
encoder.encode(srcImage, jep);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
outputStream.close();
}
}
}
这种方式在项目使用,还是有问题的.准备引入: thumbnailator 库
Maven中配置:
<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");