iOS面试那些事

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

2020-12-30  本文已影响0人  CrazySnow

图片的格式

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

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

+ (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;

上一篇下一篇

猜你喜欢

热点阅读