最近做图片缩略图处理,大部分使用java自带的ImageIO.read( InputStream )都能读取到图片,但是总有一小部分jpg图片无法读取到,read()方法会返回一个null,无法对这部分图片处理。
查阅了很多资料,了解到这部分图片基本上都是webp格式的图片。这些图片虽然文件后缀是jpg,但是实际格式是webp,用记事本打开可以看到,如图。webp是谷歌2010新出的图片类型,java无法支持这种格式的图片,正常的方式读取就会报空。
引入webp-imageio-core-0.1.0.jar,即可正常读取。
git地址:Releases · nintha/webp-imageio-core · GitHub,推荐使用0.1.0版本,0.1.3版本测试缺少类库
补充一个判断图片真实格式的方法,文件格式不是看后缀名,而是看文件头的定义的
public class ImgUtil {
public static String imgType(InputStream inputStream) throws IOException {
// 读取文件前几位
byte[] fileHeader = new byte[4];
int read = inputStream.read(fileHeader, 0, fileHeader.length);
inputStream.close();
// 转为十六进制字符串
String header = ByteUtil.bytes2Hex(fileHeader);
if (header.contains("FFD8FF")) {
return "jpg";
} else if (header.contains("89504E47")) {
return "png";
} else if (header.contains("47494638")) {
return "gif";
} else if (header.contains("424D")) {
return "bmp";
} else if (header.contains("52494646")) {
return "webp";
} else if (header.contains("49492A00")) {
return "tif";
} else {
return "unknown";
}
}
public static String bytes2Hex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
String hex = Integer.toHexString(b & 0xff);
sb.append(hex.length() == 2 ? hex : ("0"+hex));
}
return sb.toString();
}
public static void main(String[] args) throws IOException {
String path ="D:\\panda.webp";
File file = new File(path);
System.out.println(ImgUtil.imgType(new FileInputStream(file)));
}
}