远端图片尺寸获取

背景

传统获取远端图片尺寸,需要下载远端图片到本地,然后再读取图片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,手动持久化缓存。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容