iOS面试题--SDWebImage 是如何判断图片格式的原理

图片的格式

每一个图片格式都有对应的十六进制数据(PS:当然十六进制也是从二进制转换过来的),也可以说就是这些十六进制数据组成了一张图片,然后再通过计算机内部的渲染等一系列算法从而显示了一张图片,而往往前面的4~8个字节往往都代表了这张图片的格式

NSData+ImageContentType.h 的头文件夹下有这么一个方法

  • (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data;
    再来看看实现原理
+ (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data {
    if (!data) {
        return SDImageFormatUndefined;
    }

    uint8_t c;
    [data getBytes:&c length:1];
    switch (c) {
        case 0xFF:
            return SDImageFormatJPEG;
        case 0x89:
            return SDImageFormatPNG;
        case 0x47:
            return SDImageFormatGIF;
        case 0x49:
        case 0x4D:
            return SDImageFormatTIFF;
        case 0x52:
            // R as RIFF for WEBP
            if (data.length < 12) {
                return SDImageFormatUndefined;
            }

            NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding];
            if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) {
                return SDImageFormatWebP;
            }
    }
    return SDImageFormatUndefined;
}

uint8_t c;
[data getBytes:&c length:1];
这直接就截取了前1个字节长度的数据

再判断每个字节中的十六进制数所对应的格式
case 0x89: return SDImageFormatPNG;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容