前言
最近在加载图片时,由于需要对不同图片使用不同的加载方式,因此需要通过判断图片的类型进行条用不同的接口。
因此整理如下内容。
常见的图片格式头文件代码
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图片的信息分析》
暂无评论...
随机推荐
Android 8.0后音频焦点处理小结
前提两个或两个以上的 Android 应用可同时向同一输出流播放音频,系统会将所有音频流混合在一起。为了避免所有音乐应用同时播放,Android 引入了“音频焦点”的概念。一次只能有一个应用获得音频焦点。音频焦点采用合作模式对,合作模式,你可以准守也可以不准守。Android建议应用遵守...
PHP判断字符串是否相等
前言PHP语法跟其他语言一样,但不同语言存在一些差异,比如字符串的比较,就存在不一样的比较方式。下面简单记录一下,方便自己查阅。正文判断字符串相等有下面几种方式。====运算符是比较常见的。$str1 = "biumall.com";$str2 = "biumall.com";i...
Android状态栏之LabelView
前言LabelView是一个监听栈顶应用变化并应用的label(也就是应用名称)展示的View。一般在顶部状态栏中常用。封装在一起,这样只需要在xml中添加即可,简单方便,可移植。记录于此,方便自己查阅。正文涉及功能时时监听顶部Activity变化获取当前Activity的la...
AIDL个人理解总结
前言之前也简单的使用过Android的AIDL,但也都是局限于使用,至于启动的原理等都没去了解。记录一下个人对AIDL的理解,方便自己查阅。正文之前AIDL的简单Demo:《Android aidl简单使用》和《Android aidl简单使用2》。回归正题。AIDL是Android ...
[摘]Android横屏和竖屏的方法
前言本文摘抄,方便自己查阅。正文AndroidManifest.xml配置在指定的要设置的Activity对应的标签中加入android:screenOrientation相关属性。unspecified:默认值 由系统来推断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的...
[代码片段]MediaCode 播放Video中的音频
前言这就只做使用MediaCodec+AudioTrack播放Video中的音频正文原理通过MediaExtractor获取媒体的编码信息[Track索引,MediaMime,MediaFormat]根据编码信息进行创建MediaCodec在子线程循环dequeueInputBuff...