欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java代码判断图片文件格式, 不是根据文件后缀来判断。

程序员文章站 2024-02-19 12:09:58
...

public static final String TYPE_JPG = “jpg”;
public static final String TYPE_GIF = “gif”;
public static final String TYPE_PNG = “png”;
public static final String TYPE_BMP = “bmp”;
public static final String TYPE_UNKNOWN = “unknown”;

/**
* byte数组转换成16进制字符串
* @param src
* @return
*/
public static String bytesToHexString(byte[] src){
StringBuilder stringBuilder = new StringBuilder();
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}

/**
 * 根据文件流判断图片类型
 * @param fis
 * @return jpg/png/gif/bmp
 */
public static String getPicType(FileInputStream fis) {
    //读取文件的前几个字节来判断图片格式
    byte[] b = new byte[4];
    try {
        fis.read(b, 0, b.length);
        String type = bytesToHexString(b).toUpperCase();
        if (type.contains("FFD8FF")) {
            return TYPE_JPG;
        } else if (type.contains("89504E47")) {
            return TYPE_PNG;
        } else if (type.contains("47494638")) {
            return TYPE_GIF;
        } else if (type.contains("424D")) {
            return TYPE_BMP;
        }else{
            return TYPE_UNKNOWN;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }finally{
        if(fis != null){
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return null;
}

//test code
System.out.println("图片格式1: " + getPicType(new FileInputStream(new File(“D:\3_副本.png”))));
System.out.println("图片格式2: " + getPicType(new FileInputStream(new File(“D:\3.png”))));