探测图像文件类型

    xiaoxiao2021-03-25  34

    在移植多种图像格式解码器时,不知道该调用那个解码器,可以先探测图像文件类型,具体如下:

    先读取文件开头的8字节的数据:

    FILE* file; unsigned char data[8]; image_type type; int len; file = fopen(file_name, "rb"); if(!file) goto END; memset(&data[0], 0, 8); len = fread(&data[0], 1, 8, file); fclose(file);

    然后,判断类型:

    static image_type judge_type(unsigned char* data, int len) { if(len < 2) return EEMPTY; if(!png_sig_cmp(data, 0, 8)) { return EPNG; } if(data[0] == 0xFF && data[1] == 0xd8) { return EJPEG; } if(data[0] == 0x42 && data[1] == 0x4D) return EBMP; return EUNKNOWN; }

    png格式判断前8个字节,如下:

    png_sig_cmp(uint8_t sig[8], int start, int num_to_check) { uint8_t png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10}; if (num_to_check > 8) num_to_check = 8; else if (num_to_check < 1) return (-1); if (start > 7) return (-1); if (start + num_to_check > 8) num_to_check = 8 - start; return ((int)(memcmp(&sig[start], &png_signature[start], num_to_check))); }

    如果前8个字节相同,返回0,否则返回大于0的数。

    文件类型枚举:

    typedef enum image_type_t { EJPEG = 0, EPNG, EBMP, EUNKNOWN, EEMPTY, ENOFILE }image_type;

    这里只支持PNG、JPEG、BMP格式,其他类型的方法类似,不多说。

    转载请注明原文地址: https://ju.6miu.com/read-50312.html

    最新回复(0)