背景
傳統(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對比:
JPG對比:
關(guān)于緩存
NSURLSessionConfiguration.defaultSessionConfiguration默認(rèn)會緩存數(shù)據(jù)墅诡,下次會走本地緩存,加速識別桐智。
當(dāng)然末早,你也可以補充緩存方案,把url作為key说庭,Size為Value然磷,手動持久化緩存。