导航号,我的单页导航
目录

前言

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

因此整理如下内容。

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

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、 本站网址 https://www.91es.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权请留言
4、 本站禁止发布或转载任何违法的相关信息,如有发现请向站长举报
导航号,我的单页导航

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

暂无评论...