Java如何判断一个文件是否为图片呢?
下文笔者讲述从java后台检测一个文件是否为图片的简介说明,如下所示
文件是否为图片的检测方法
实现思路:
1.通过后缀名判断是否为图片
2.通过文件头判断是否为图片
如:
JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
TIFF (tif),文件头:49492A00
Windows Bitmap (bmp),文件头:424D
3.使用ImageIO判断
例:
后缀名方式检测文件是否为图片
判断文件后缀名
String extension = "";
int i = fileName.lastIndexOf('.');
if (i > 0) {
extension = fileName.substring(i+1);
}
//...
if("jpg".equals(extension)){
//your code
}
判断文件头
使用MimetypesFileTypeMap来判断
public class ImageCheck {
private MimetypesFileTypeMap mtftp;
public ImageCheck(){
mtftp = new MimetypesFileTypeMap();
mtftp.addMimeTypes("image png tif jpg jpeg bmp");
}
public boolean isImage(File file){
String mimetype= mtftp.getContentType(file);
String type = mimetype.split("/")[0];
return type.equals("image");
}
}
使用ImageIO来判断
try {
// 通过ImageReader来解码这个file并返回一个BufferedImage对象
// 如果找不到合适的ImageReader则会返回null,我们可以认为这不是图片文件
// 或者在解析过程中报错,也返回false
Image image = ImageIO.read(file);
return image != null;
} catch(IOException ex) {
return false;
}
测试
public class ImageCheckerTest {
private File imageFile;//真正的图片文件 图片
private File txt2ImageFile; //将txt后缀改为jpg txt
private File image2txt;//将图片文件后缀改为txt 图片
@Before
public void init(){
imageFile = new File("E:\\test20230111.jpg");
txt2ImageFile = new File("E:\\test20230111.jpg");
image2txt = new File("E:\\test20230111.txt");
}
@Test
public void test1(){
MimetypesFileTypeMap mtftp = new MimetypesFileTypeMap();
mtftp.addMimeTypes("image png tif jpg jpeg bmp");
String mimetype = mtftp.getContentType(imageFile);
String type = mimetype.split("/")[0];
assertTrue(type.equals("image"));
mimetype = mtftp.getContentType(txt2ImageFile);
type = mimetype.split("/")[0];
assertFalse(type.equals("image"));
mimetype = mtftp.getContentType(image2txt);
type = mimetype.split("/")[0];
assertTrue(type.equals("image"));
}
@Test
public void test2() throws IOException {
String mimetype = Files.probeContentType(imageFile.toPath());
String type = mimetype.split("/")[0];
assertTrue(type.equals("image"));
mimetype = Files.probeContentType(txt2ImageFile.toPath());
type = mimetype.split("/")[0];
assertFalse(type.equals("image"));
mimetype = Files.probeContentType(image2txt.toPath());
type = mimetype.split("/")[0];
assertTrue(type.equals("image"));
}
@Test
public void test3() {
FileNameMap fileNameMap = URLConnection.getFileNameMap();
String type = fileNameMap.getContentTypeFor(imageFile.getAbsolutePath()).split("/")[0];
assertTrue(type.equals("image"));
type = fileNameMap.getContentTypeFor(txt2ImageFile.getAbsolutePath()).split("/")[0];
assertFalse(type.equals("image"));
type = fileNameMap.getContentTypeFor(image2txt.getAbsolutePath()).split("/")[0];
assertTrue(type.equals("image"));
}
@Test
public void test4() throws IOException {
assertTrue(check4(imageFile));
assertFalse(check4(txt2ImageFile));
assertTrue(check4(image2txt));
}
public boolean check4(File file){
try {
Image image = ImageIO.read(file);
return image != null;
} catch(IOException ex) {
return false;
}
}
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


