最新消息:iOS编程开发交流群(6906921) ,Mac.Cocoa开发交流群(7758675) 欢迎iOS/macOS开发编程爱好及学习者加入!

iOS开发之预读取网络图片尺寸

iOS 天狐 9662浏览 0评论

在进行iOS开发时,经常会遇到这种情况:

  • 常常想不下载图片,根据网络图片URL获取图片的尺寸。根据得到尺寸或者比例显示占位图片与轮廓预览区域。当完全下载下来图片后,替换上去。
  • TableView显示的时候要动态的设置Cell的高度,因为大量的图片不会一口气下载完成,所以想先拿到图片的高度把Cell的高度提前设置好。
  • 根据图片尺寸或比例动态创建控件

方法

1.服务端返回的JSON等等数据的时候不仅仅返回一个URL,额外返回一个字段描述图片大小。

2.返回图片URL时拼接该图片的宽高

比如http://xxx.com/images/pic_215x500.jpg,http://xxx.com/images/pic.jpg@215x500 ,http://xxx.com/images/pic_215_500.jpg,格式与服务器端约定好即可。

最好是上传图片的时候直接把尺寸拼接将要存储的图片文件,这样正常访问图片的url解析尺寸就行了。

3.HTTP响应头中写入图片的宽高

4.完全下载下来图片后获的宽高

这种方式,耗费性能与流量。完全不建议。是有没办法的办法。

5.图片数据头中写入图片的宽高

此方法需要服务器支持Range分段请求,整个图片虽然很大,可能只需要很少的字节就能得到图片的大小

curl判断服务器是否支持Range请求

mac的终端下执行:

返回

输出结果 Accept-Ranges: bytes 或者statuscode等于206,说明服务器支持按字节下载。我们看到标准的返回中Content-Type就可以判断图片类型了。

iOS代码检测

iOS从图片数据头请求尺寸

常见图片的range

PngRange = @"bytes=16-23";
JPGRange = @"bytes=0-209";
GIFRange = @"bytes=6-9";

请求

尺寸解析

从数据头中解析图片的尺寸大同小异,也许每个人的方法具体算法不同,但是核心还是一样的。当然这么多代码肯定不是我写的。来自互联网。

PNG,png尺寸在16-23字节中,所以请求的时候只需要请求8字节即可解析出具体尺寸:

GIF

JPG

总结

从图片头中获取尺寸并不是一个高效的方法,耗费服务器性能,增加服务端负担。

其实如果是自己服务器的图片,采用url附带尺寸是非常好的选择。最好是上传图片的时候直接把尺寸拼接将要存储的图片文件名中。

从图片数据头请求尺寸Demo

https://github.com/shaojiankui/UIImage-RemoteSize

转载请注明:天狐博客 » iOS开发之预读取网络图片尺寸

微信 OR 支付宝 扫描二维码
为天狐 打赏
非常感谢你的支持,哥会继续努力!
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址