iOS面試題--SDWebImage 是如何判斷圖片格式的原理

圖片的格式

每一個圖片格式都有對應(yīng)的十六進制數(shù)據(jù)(PS:當然十六進制也是從二進制轉(zhuǎn)換過來的),也可以說就是這些十六進制數(shù)據(jù)組成了一張圖片,然后再通過計算機內(nèi)部的渲染等一系列算法從而顯示了一張圖片,而往往前面的4~8個字節(jié)往往都代表了這張圖片的格式

NSData+ImageContentType.h 的頭文件夾下有這么一個方法

  • (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data;
    再來看看實現(xiàn)原理
+ (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個字節(jié)長度的數(shù)據(jù)

再判斷每個字節(jié)中的十六進制數(shù)所對應(yīng)的格式
case 0x89: return SDImageFormatPNG;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容