前言

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

因此整理如下内容。

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

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、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

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...