iOS判断图片格式

一、枚举定义图片类型

typedef NS_ENUM(NSUInteger, ImageType) {
    ImageTypeUnknow = 0,
    ImageTypeJPEG,
    ImageTypeJPEG2000,
    ImageTypeTIFF,
    ImageTypeBMP,
    ImageTypeICO,
    ImageTypeICNS,
    ImageTypeGIF,
    ImageTypePNG,
    ImageTypeWebP,
    ImageTypeOther,
};

二、定义方法

CG_EXTERN ImageType ImageDetectType(CFDataRef data);

三、方法实现

#define _FOUR_CC(c1,c2,c3,c4) ((uint32_t)(((c4) << 24) | ((c3) << 16) | ((c2) << 8) | (c1)))
#define _TWO_CC(c1,c2) ((uint16_t)(((c2) << 8) | (c1)))

ImageType ImageDetectType(CFDataRef data) {
    if (!data) return ImageTypeUnknow;
    uint64_t length = CFDataGetLength(data);
    if (length < 16) return ImageTypeUnknow;

    const char *bytes = (char *)CFDataGetBytePtr(data);

    uint32_t magic4 = *((uint32_t *)bytes);
    switch (magic4) {
        case _FOUR_CC(0x4D, 0x4D, 0x00, 0x2A): { // big endian TIFF
            return ImageTypeTIFF;
        } break;

        case _FOUR_CC(0x49, 0x49, 0x2A, 0x00): { // little endian TIFF
            return ImageTypeTIFF;
        } break;

        case _FOUR_CC(0x00, 0x00, 0x01, 0x00): { // ICO
            return ImageTypeICO;
        } break;

        case _FOUR_CC('i', 'c', 'n', 's'): { // ICNS
            return ImageTypeICNS;
        } break;

        case _FOUR_CC('G', 'I', 'F', '8'): { // GIF
            return ImageTypeGIF;
        } break;

        case _FOUR_CC(0x89, 'P', 'N', 'G'): {  // PNG
            uint32_t tmp = *((uint32_t *)(bytes + 4));
            if (tmp == _FOUR_CC('\r', '\n', 0x1A, '\n')) {
                return ImageTypePNG;
            }
        } break;

        case _FOUR_CC('R', 'I', 'F', 'F'): { // WebP
            uint32_t tmp = *((uint32_t *)(bytes + 8));
            if (tmp == _FOUR_CC('W', 'E', 'B', 'P')) {
                return ImageTypeWebP;
            }
        } break;
    }

    uint16_t magic2 = *((uint16_t *)bytes);
    switch (magic2) {
        case _TWO_CC('B', 'A'):
        case _TWO_CC('B', 'M'):
        case _TWO_CC('I', 'C'):
        case _TWO_CC('P', 'I'):
        case _TWO_CC('C', 'I'):
        case _TWO_CC('C', 'P'): { // BMP
            return ImageTypeBMP;
        }
        case _TWO_CC(0xFF, 0x4F): { // JPEG2000
            return ImageTypeJPEG2000;
        }
    }
    if (memcmp(bytes,"\377\330\377",3) == 0) return ImageTypeJPEG;
    if (memcmp(bytes + 4, "\152\120\040\040\015", 5) == 0) return ImageTypeJPEG2000;
    return ImageTypeUnknow;
}

四、调用

NSURL *url = [NSURL URLWithString:@"http://pic.nipic.com/2007-11-09/2007119122519868_2.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
ImageType imageType = ImageDetectType((__bridge CFDataRef)data);
NSLog(@"%@",imageType);

五、打印结果

ImageTypeJPEG

                                深信积累的力量,时间就是你的朋友,否则,他就是你的敌人  

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 144,372评论 18 621
  • 百战程序员_ Java1573题 QQ群:561832648489034603 掌握80%年薪20万掌握50%年薪...
    Albert陈凯阅读 13,458评论 3 33
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 27,008评论 17 394
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 23,997评论 30 468
  • 很多人的认知误区:管理别人就是让别人听话,别人都得听你的,你说什么就是什么。 我觉得这不叫管理,这应该叫统治或者压...
    路叔叔阅读 55评论 0 1