这里不讨论通过文件后缀名的判断方式,因为可以很容易的手动修改后缀名。
这里讨论如何通过文件的二进制流来判断一张图片是否为jpg格式的图片。对图像图像不太了解,请教了一位图像方向的同事后,大致了解了一些,这里写出来,作为笔记和分享。
原理很简单:所有JPG/JPEG格式的图片都是以十六进制的'FF D8'作为文件开始,'FF D9'作为文件结束标志。FF等为16进制数据,占文件的1 byte。如果没有带相机信息的jpg图片,第7, 8, 9, 10这4位上分别是字符'JFIF'的16进制表示,用UltraEdit打开可以直接看到;如果带有相机信息,有可能与不带信息的不同,也可能相同,不同的话在那4位上为'Exif'字符的16进制表示,但是他们都是以FF D8开始,FF D9结束。
原理清楚后,直接代码:
InputStream bin = new FileInputStream("C:/Users/wuyao/Desktop/sisu.jpg"); // a jpg file
int b[] = new int[4];
b[0] = bin.read();
b[1] = bin.read();
bin.skip(bin.available() - 2);
b[2] = bin.read();
b[3] = bin.read();
bin.close();
boolean m = bin.markSupported();
for (int e : b) {
System.out.print(e + "-");
}
//
StringBuffer buf = new StringBuffer("");
for (int e : b) {
buf.append(e);
buf.append(", ");
}
buf.delete(buf.length() - 2, buf.length());
System.out.println(buf.toString());
// should be: 255, 216, 255, 217
其他图片格式需要再学习相应的格式规范,以此类推,应该不难。