在iOS开发过程中经常需要通过网络请求加载图片,有时,需要在创建UIImageView或UIButton来显示图片之前需要提前知道图片的尺寸,根据图片尺寸创建对应大小的控件。但是对于网络图片来说,要想通过最优的方法获得尺寸就略微有点困难,大体思路就是下面这种:

如果有使用SDWebImage,则首先检查是否缓存过该图片,如果没有,先通过文件头获取图片大小(针对格式为png、gif、jpg文件获取其尺寸大小),如果获取失败,则下载完整的图片data,然后计算大小,如果有使用SDWebImage,则使用SDWebImage缓存该图片。

+(CGSize)downloadImageSizeWithURL:(id)imageURL

{

NSURL* URL = nil;

if([imageURL isKindOfClass:[NSURL class]]){

URL = imageURL;

}

if([imageURL isKindOfClass:[NSString class]]){

URL = [NSURL URLWithString:imageURL];

}

if(URL == nil)

return CGSizeZero;

#ifdef dispatch_main_sync_safe

if([[SDImageCache sharedImageCache] diskImageExistsWithKey:absoluteString])

{

UIImage* image = [[SDImageCache sharedImageCache] imageFromMemoryCacheForKey:absoluteString];

if(!image)

{

NSData* data = [[SDImageCache sharedImageCache] performSelector:@selector(diskImageDataBySearchingAllPathsForKey:) withObject:URL.absoluteString];

image = [UIImage imageWithData:data];

}

if(image)

{

return image.size;

}

}

#endif

NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:URL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:1];

NSString* pathExtendsion = [URL.pathExtension lowercaseString];

CGSize size = CGSizeZero;

if ([pathExtendsion rangeOfString:@"png"].location != NSNotFound) {

size =  [self downloadPNGImageSizeWithRequest:request];

}

else if([pathExtendsion rangeOfString:@"gif"].location != NSNotFound)

{

size =  [self downloadGIFImageSizeWithRequest:request];

}

else{

size = [self downloadJPGImageSizeWithRequest:request];

}

if(CGSizeEqualToSize(CGSizeZero, size))

{

NSData* data = [NSData dataWithContentsOfURL:URL];

UIImage* image = [UIImage imageWithData:data];

if(image)

{

//如果未使用SDWebImage,则忽略;缓存该图片

#ifdef dispatch_main_sync_safe

[[SDImageCache sharedImageCache] storeImage:image recalculateFromImage:YES imageData:data forKey:URL.absoluteString toDisk:YES];

#endif

size = image.size;

}

}

//过滤掉不符合大小的图片,大图太大浪费流量,用户体验不好

if (size.height > 2048 || size.height <= 0 || size.width > 2048 || size.width <= 0 ) {

return CGSizeZero;

}

else

{

return size;

}

}

+(CGSize)downloadPNGImageSizeWithRequest:(NSMutableURLRequest*)request

{

[request setValue:@"bytes=16-23" forHTTPHeaderField:@"Range"];

NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

if(data.length == 8)

{

int w1 = 0, w2 = 0, w3 = 0, w4 = 0;

[data getBytes:&w1 range:NSMakeRange(0, 1)];

[data getBytes:&w2 range:NSMakeRange(1, 1)];

[data getBytes:&w3 range:NSMakeRange(2, 1)];

[data getBytes:&w4 range:NSMakeRange(3, 1)];

int w = (w1 << 24) + (w2 << 16) + (w3 << 8) + w4;

int h1 = 0, h2 = 0, h3 = 0, h4 = 0;

[data getBytes:&h1 range:NSMakeRange(4, 1)];

[data getBytes:&h2 range:NSMakeRange(5, 1)];

[data getBytes:&h3 range:NSMakeRange(6, 1)];

[data getBytes:&h4 range:NSMakeRange(7, 1)];

int h = (h1 << 24) + (h2 << 16) + (h3 << 8) + h4;

return CGSizeMake(w, h);

}

return CGSizeZero;

}

+(CGSize)downloadGIFImageSizeWithRequest:(NSMutableURLRequest*)request

{

[request setValue:@"bytes=6-9" forHTTPHeaderField:@"Range"];

NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

if(data.length == 4)

{

short w1 = 0, w2 = 0;

[data getBytes:&w1 range:NSMakeRange(0, 1)];

[data getBytes:&w2 range:NSMakeRange(1, 1)];

short w = w1 + (w2 << 8);

short h1 = 0, h2 = 0;

[data getBytes:&h1 range:NSMakeRange(2, 1)];

[data getBytes:&h2 range:NSMakeRange(3, 1)];

short h = h1 + (h2 << 8);

return CGSizeMake(w, h);

}

return CGSizeZero;

}

+(CGSize)downloadJPGImageSizeWithRequest:(NSMutableURLRequest*)request

{

[request setValue:@"bytes=0-209" forHTTPHeaderField:@"Range"];

NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

if ([data length] <= 0x58) {

return CGSizeZero;

}

if ([data length] < 210) {// 肯定只有一个DQT字段

short w1 = 0, w2 = 0;

[data getBytes:&w1 range:NSMakeRange(0x60, 0x1)];

[data getBytes:&w2 range:NSMakeRange(0x61, 0x1)];

short w = (w1 << 8) + w2;

short h1 = 0, h2 = 0;

[data getBytes:&h1 range:NSMakeRange(0x5e, 0x1)];

[data getBytes:&h2 range:NSMakeRange(0x5f, 0x1)];

short h = (h1 << 8) + h2;

return CGSizeMake(w, h);

} else {

short word = 0x0;

[data getBytes:&word range:NSMakeRange(0x15, 0x1)];

if (word == 0xdb) {

[data getBytes:&word range:NSMakeRange(0x5a, 0x1)];

if (word == 0xdb) {// 两个DQT字段

short w1 = 0, w2 = 0;

[data getBytes:&w1 range:NSMakeRange(0xa5, 0x1)];

[data getBytes:&w2 range:NSMakeRange(0xa6, 0x1)];

short w = (w1 << 8) + w2;

short h1 = 0, h2 = 0;

[data getBytes:&h1 range:NSMakeRange(0xa3, 0x1)];

[data getBytes:&h2 range:NSMakeRange(0xa4, 0x1)];

short h = (h1 << 8) + h2;

return CGSizeMake(w, h);

} else {// 一个DQT字段

short w1 = 0, w2 = 0;

[data getBytes:&w1 range:NSMakeRange(0x60, 0x1)];

[data getBytes:&w2 range:NSMakeRange(0x61, 0x1)];

short w = (w1 << 8) + w2;

short h1 = 0, h2 = 0;

[data getBytes:&h1 range:NSMakeRange(0x5e, 0x1)];

[data getBytes:&h2 range:NSMakeRange(0x5f, 0x1)];

short h = (h1 << 8) + h2;

return CGSizeMake(w, h);

}

} else {

return CGSizeZero;

}

}

}

iOS获取网络图片大小的更多相关文章

  1. [转载] IOS 获取网络图片的大小 改变 图片色值 灰度什么的方法集合

    IOS 获取网络图片的大小 改变 图片色值 灰度什么的方法集合

  2. iOS 获取网络图片的大小

    一直都在找关于获取网络图片的大小的方法, 今天找到了一个能解决的办法 ,如下 1, 导入框架 #import <ImageIO/ImageIO.h> 2. 使用此方法得到image的siz ...

  3. iOS 获取内存大小使用情况(进度条显示)

    一.获取设备内存大小方法 //返回存储内存占用比例 - (NSString *)getFreeDiskspaceRate{ float totalSpace; .f; NSError *error = ...

  4. java 获取图片大小(尺寸)

    1,获取本地图片大小(尺寸) File picture=new File(strSrc);BufferedImage sourceImg=ImageIO.read(new FileInputStrea ...

  5. IOS -- 获取本地图片和网络图片的大小size

    // 获取图片的size CGSize size = [UIImage imageNamed:@"regStep2_sex"].size; 获取网络图片的尺寸: // 根据图片ur ...

  6. 分享一个安卓中异步获取网络图片并自适应大小的第三方程序(来自github)

    安卓中获取网络图片,生成缓存 用安卓手机,因为手机流量的限制,所以我们在做应用时,要尽量为用户考虑,尽量少耗点用户的流量,而在应用中网络图片的显示无疑是消耗流量最大的,所以我们可以采取压缩图片或者将图 ...

  7. 获取网络图片的大小 改变 图片色值 灰度什么的方法集合-b

    直接上代码了 头文件 // 图片处理 0 半灰色  1 灰度   2 深棕色    3 反色 +(UIImage*)imageWithImage:(UIImage*)image grayLevelTy ...

  8. IOS 获取网络图像尺寸 更改 图像色彩值 什么一套方法灰色

    直接在代码 头文件 // 图片处理 0 半灰色 1 灰度 2 深棕色 3 反色 +(UIImage*)imageWithImage:(UIImage*)image grayLevelType:(UII ...

  9. cocos2d-x C++ 获取网络图片缓存并展示

    #ifndef __HttpGetImg__ #define __HttpGetImg__ #include "cocos2d.h" #include "HttpRequ ...

随机推荐

  1. .Net程序在linux mono环境和WindowsServer上执行测试对比

    最近研究了一下mono,想把windows上写的.Net程序移植到linux上跑.网上有资料说Linux上mono执行.Net程序效率比Windows高,本着实证的态度,只有实际验证过才有说服力. 写 ...

  2. qt5中信号和槽的新语法

    qt5中的连接 有下列几种方式可以连接到信号上 旧语法 qt5将继续支持旧的语法去连接,在QObject对象上定义信号和槽函数,及任何继承QObjec的对象(包含QWidget). connect(s ...

  3. 让Unity NavMesh为我所用

    Unity里面整合了一个NavMesh功能,虽然让人又爱又恨. 但当你在其他地方需要这个NavMesh的数据时,就更让人欲罢不能了. 比如说服务器需要Unity的NavMesh数据时. 比如说你想将U ...

  4. Sublime Text3使用总结

    写在前面的话:平时做项目中在用eclipse和vs,但是对于一些小项目,感觉没有必要搞那么大的一个工具使用,比如写个小微商城,搞个小脚本了什么,所以就一直在用Sublime Text,界面清新简洁,没 ...

  5. ABP框架 - 仓储

    文档目录 本节内容: 默认仓储 自定义仓储 自定义仓储接口 自定义仓储实现 基仓储方法 查询 获取单个实体 获取实体列表 关于 IQueryable 自定义返回值 插入 更新 删除 其它 关于异步方法 ...

  6. C++11网络编程

    Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...

  7. javascript关于立即函数

    以前的知识总是忘,遇到代码又看不懂.要再复习一下,顺便记录一下. 关于立即执行函数:  函数声明:function fnName () {…};使用function关键字声明一个函数,再指定一个函数名 ...

  8. 设计模式之接口隔离原则(ISP)

    一.定义: ISP:Interface Segregation Principle 接口隔离原则表明客户端不应该被强迫实现一些他们不会使用的接口,应该把胖接口中的方法分组,然后用多个接口代替它,每个接 ...

  9. 【SQL】关于无法附加文件的错误

    [SQL]关于无法附加文件的错误 1.错误信息如下: 2.估计是权限问题右击属性,把权限开一下 3.然后就附加成功了~~ ——————————————————————————————————————— ...

  10. Android开发之自定义的ListView(UITableViewController)

    Android开发中的ListView, 顾名方法思义,就是表视图.表示图在iOS开发中就是TableView.两者虽然名称不一样,但是其使用方法,使用场景以及该控件的功能都极为相似,都是用来展示大量 ...