前言
最近在加载图片时,由于需要对不同图片使用不同的加载方式,因此需要通过判断图片的类型进行条用不同的接口。
因此整理如下内容。
常见的图片格式头文件代码
PS:如下是十六进制
- JPEG (jpg) 文件头:FFD8FF
- PNG (png) 文件头:
89504E47(打印png的值是:89506082) - GIF (gif) 文件头:47494638
- Windows Bitmap (bmp) 文件头:424D
- TIFF (tif) 文件头:49492A00
总结
- gif,jpg,bmp测试通过
- tiff由于没有图片,没有测试
- png的判断存在问题,上面也备注了,打印值跟89 50 4E 47 不一样
正文
下面是测试的代码片段。
PS:代码中判断的是十进制,需要转换一下
gif 格式
/** * gif (十六进制 : 47 49 46 38) * * @param file * @return */ public static boolean isGifFile(File file) { FileInputStream fileInputStream = null; try { fileInputStream = new FileInputStream(file); int[] buffer = new int[5]; buffer[0] = fileInputStream.read(); buffer[1] = fileInputStream.read(); buffer[2] = fileInputStream.read(); buffer[3] = fileInputStream.read(); fileInputStream.skip(fileInputStream.available() - 1); buffer[4] = fileInputStream.read(); return buffer[0] == 71 && buffer[1] == 73 && buffer[2] == 70 && buffer[3] == 56; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { if (null != fileInputStream) { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } return false; }
jpg 格式
/** * jpg (十六进制 : FF D8 FF) * * @param file * @return */ public static boolean isJpgFile(File file) { FileInputStream fileInputStream = null; try { fileInputStream = new FileInputStream(file); int buffer[] = new int[4]; buffer[0] = fileInputStream.read(); buffer[1] = fileInputStream.read(); fileInputStream.skip(fileInputStream.available() - 2); buffer[2] = fileInputStream.read(); buffer[3] = fileInputStream.read(); return buffer[0] == 255 && buffer[1] == 216 && buffer[2] == 255; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); }finally { if (null != fileInputStream) { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } return false; }
bmp格式
/** * bmp (十六进制 : 42 4D) * * @param file * @return */ public static boolean isBmpFile(File file) { FileInputStream fileInputStream = null; try { fileInputStream = new FileInputStream(file); int buffer[] = new int[4]; buffer[0] = fileInputStream.read(); buffer[1] = fileInputStream.read(); fileInputStream.skip(fileInputStream.available() - 2); buffer[2] = fileInputStream.read(); buffer[3] = fileInputStream.read(); return buffer[0] == 66 && buffer[1] == 77; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); }finally { if (null != fileInputStream) { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } return false; }
tiff格式
/** * tiff (十六进制 : 49 49 2A 00) * * @param file * @return */ public static boolean isTiffFile(File file) { FileInputStream fileInputStream = null; try { fileInputStream = new FileInputStream(file); int buffer[] = new int[4]; buffer[0] = fileInputStream.read(); buffer[1] = fileInputStream.read(); fileInputStream.skip(fileInputStream.available() - 2); buffer[2] = fileInputStream.read(); buffer[3] = fileInputStream.read(); return buffer[0] == 73 && buffer[1] == 73 && buffer[2] == 42 && buffer[2] == 00; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); }finally { if (null != fileInputStream) { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } return false; }
png格式
参考网上的值,这个png测试不通过,打印对应的值是 89506082 (十六进制)
/** * png (十六进制 : 89 50 4E 47) * * @param file * @return */ public static boolean isPngFile(File file) { FileInputStream fileInputStream = null; try { fileInputStream = new FileInputStream(file); int buffer[] = new int[4]; buffer[0] = fileInputStream.read(); buffer[1] = fileInputStream.read(); fileInputStream.skip(fileInputStream.available() - 2); buffer[2] = fileInputStream.read(); buffer[3] = fileInputStream.read(); return buffer[0] == 137 && buffer[1] == 80 && buffer[2] == 78 && buffer[3] == 71; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } if (null != fileInputStream) { try { fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } return false; }
参考文章
- 《android、java中判断图片文件的格式》
- 《Java判断文件是否为图片文件(GIF,PNG,JPG)》
- 《c#判断图形文件(GIF,JPG,PNG)的图片格式的方法》
- 《PNG文件结构分析 ---Png解析》
- 《Android中Gif图片显示(一)-GIF图片的信息分析》
暂无评论...
随机推荐
[代码]开启WiFi调试
前言开启WiFi调试有两种,一种是adb开启,二是app中代码开启。第一种是可以,但毕竟麻烦,这里我就不细说了,可以百度一下。下面是选择第二种方式。正文以下是开启WiFi debug的代码,这里记录一下,方便查阅。隐藏内容!付费阅读后才能查看!¥2 ¥3多个隐藏块只需支付一次付费阅读参...
[代码片段]ListView+Letter排序代码
前言需求:歌曲按照A-Z(或a-z)#排序,并触摸左侧字母可定位对应的字母Item(参考通讯录字母查询)实例:通讯录和音乐中会用到正文隐藏内容!付费阅读后才能查看!¥5多个隐藏块只需支付一次付费阅读参考文章无
使用adb shell命令启动动画
adb shell 命令Adb的全称为Android Debug Bridge:android调试桥梁。Android的初衷是用adb这样的一个工具来协助开发人员在开发android应用的过程中更快更好的调试apk,因此adb具有安装卸载apk、拷贝推送文件、查看设备硬件信息、查看应用程序占用...
[摘]已知圆心,半径,角度,求圆上的任一点的坐标
前言原理很简单,大家初中都学过的,但,由于Java中的sin和cos传入的值是弧度,我一开始一直用角度,导致得不出对应的值。摘抄于此,方便自己查阅。好记性不如烂笔头正文PS:本文摘抄,只是文本继续一定编辑和整理。圆心坐标 :(x0, y0)半径 : r角度: a设圆上任何一点坐标...
startService()源码分析
前言startService()源码分析之前Android 6.0是有简单分析过的,但太久了,而且记录也很粗糙,到现在也忘记得差不多了。最近抽空重新走一下,也算是自己的复习吧。这里看的是Android P的源代码。正文这里是Apk1去启动Apk2的服务(Apk2没有启动过)Intent...
AudioTrack简单简介之三:爆音
一、播放WAV有爆音的原因AudioTrack播放wav有爆音有几种情况第一种:仅仅开始播放时爆音这里两种情况:1、wav音频有问题,用工具查看一下久知道,或者使用Android版的酷我音乐播放一下,看看有没有爆音,如果有,那就是音频问题了,没有就是第二种情。2、‘WAV都...