目录

前言

最近在加载图片时,由于需要对不同图片使用不同的加载方式,因此需要通过判断图片的类型进行条用不同的接口。

因此整理如下内容。

常见的图片格式头文件代码

PS:如下是十六进制

  1. JPEG (jpg) 文件头:FFD8FF
  2. PNG (png) 文件头:89504E47 (打印png的值是:89506082)
  3. GIF (gif) 文件头:47494638
  4. Windows Bitmap (bmp) 文件头:424D
  5. TIFF (tif) 文件头:49492A00

总结

  1. gif,jpg,bmp测试通过
  2. tiff由于没有图片,没有测试
  3. 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;
    }

参考文章

  1. android、java中判断图片文件的格式
  2. Java判断文件是否为图片文件(GIF,PNG,JPG)
  3. c#判断图形文件(GIF,JPG,PNG)的图片格式的方法
  4. PNG文件结构分析 ---Png解析
  5. Android中Gif图片显示(一)-GIF图片的信息分析

版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com[备用域名]
3、 本站内容: 部分来源于网络,仅供站长学习和参考,若侵权请留言

暂无评论

暂无评论...

随机推荐

[代码]开启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都...