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; } } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。