远端图片尺寸获取

背景

传统获取远端图片尺寸,需要下载远端图片到本地,然后再读取图片Size。

存在问题

  1. 假如图片很大,消耗时长较长。
  2. 仅仅想获取Size,而不使用此图,下载全图纯属浪费。

问题分析

如果能不下载图片,就能读取Size,那么就完美了。

JPG/PNG/GIF

传统的JPG/PNG/GIF,尺寸信息是写在图片Data头部的EXIF,下载完此头部,即可得到图片尺寸信息,而无需下载整张图片。

参考:
JPG信息格式
PNG信息

如何读取文件头部信息

答案就是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对比:


GIF

JPG对比:


JPG

关于缓存

NSURLSessionConfiguration.defaultSessionConfiguration默认会缓存数据,下次会走本地缓存,加速识别。
当然,你也可以补充缓存方案,把url作为key,Size为Value,手动持久化缓存。

你可能感兴趣的:(远端图片尺寸获取)