背景
傳統(tǒng)獲取遠(yuǎn)端圖片尺寸,需要下載遠(yuǎn)端圖片到本地,然后再讀取圖片Size。
存在問題
- 假如圖片很大,消耗時長較長。
- 僅僅想獲取Size,而不使用此圖,下載全圖純屬浪費。
問題分析
如果能不下載圖片,就能讀取Size,那么就完美了。
JPG/PNG/GIF
傳統(tǒng)的JPG/PNG/GIF,尺寸信息是寫在圖片Data頭部的EXIF,下載完此頭部,即可得到圖片尺寸信息,而無需下載整張圖片。
如何讀取文件頭部信息
答案就是ImageIO,示例代碼如下:
CGImageSourceRef sourceRef = CGImageSourceCreateIncremental(NULL);
// 傳入圖片頭部
CGImageSourceUpdateData(sourceRef, (__bridge CFDataRef)data, NO);
CGImageRef imageRef = CGImageSourceCreateImageAtIndex(sourceRef, 0, NULL);
CGSize size = CGSizeMake(CGImageGetWidth(imageRef), CGImageGetHeight(imageRef));
// Print圖片尺寸
CGImageRelease(imageRef);
CFRelease(sourceRef);
完整代碼
下載圖片頭部,解析圖片信息。
代碼下載:https://github.com/V5zhou/GDRemoteImageSize
效果對比
隨便找了幾張圖對比,由于網(wǎng)速波動不太可靠,大概優(yōu)化10倍左右。
GIF對比:

GIF
JPG對比:

JPG
關(guān)于緩存
NSURLSessionConfiguration.defaultSessionConfiguration默認(rèn)會緩存數(shù)據(jù),下次會走本地緩存,加速識別。
當(dāng)然,你也可以補(bǔ)充緩存方案,把url作為key,Size為Value,手動持久化緩存。