背景
传统获取远端图片尺寸,需要下载远端图片到本地,然后再读取图片Size。
存在问题
- 假如图片很大,消耗时长较长。
- 仅仅想获取Size,而不使用此图,下载全图纯属浪费。
问题分析
如果能不下载图片,就能读取Size,那么就完美了。
JPG/PNG/GIF
传统的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
效果对比
随便找了几张图对比,由于网速波动不太可靠,大概优化10倍左右。
GIF对比:
JPG对比:
关于缓存
NSURLSessionConfiguration.defaultSessionConfiguration默认会缓存数据,下次会走本地缓存,加速识别。
当然,你也可以补充缓存方案,把url作为key,Size为Value,手动持久化缓存。