iOS获取网络图片大小

  在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;

}

}

}

时间: 2024-08-05 08:30:51

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

检测SDWebImage有没有缓存图片 IOS 获取网络图片大小

NSURL *url = [NSURL URLWithString:[model.content objectForKey:@"image"]];             //请求网络地址数据的同步方法             //因为这个方法在子线程(全局队列)中执行,所以不需要考虑死线程的问题             SDWebImageManager *manager = [SDWebImageManager sharedManager];              [manag

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

第一.复制对象的基本概念 复制一个对象为副本,开辟一块新的内存来存储副本对象. 第二.如果一个对象想具备复制的功能,必须实现<NSCopying>协议和<NSMutableCopying>协议 NSObject自带的常用的对象有:NSNumber.NSString.NSArray.NSDictionary.NSMutableArray.NSMutableDictionay.NSMutableString,copy产生的对象时不可变的,mutableCopy产生的对象时可变的 第三.

iOS 获取网络图片的大小

一直都在找关于获取网络图片的大小的方法, 今天找到了一个能解决的办法 ,如下 1, 导入框架 #import <ImageIO/ImageIO.h> 2. 使用此方法得到image的size - (CGSize)getImageSizeWithURL:(NSURL *)url { CGImageSourceRef imageSource = CGImageSourceCreateWithURL((CFURLRef)url, NULL); CGFloat width = 0.0f, height

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

一.获取设备内存大小方法 //返回存储内存占用比例 - (NSString *)getFreeDiskspaceRate{ float totalSpace; float totalFreeSpace=0.f; NSError *error = nil; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSDictionary *dictionary

java 获取图片大小(尺寸)

1,获取本地图片大小(尺寸) File picture=new File(strSrc);BufferedImage sourceImg=ImageIO.read(new FileInputStream(picture)); sourceImg.getWidth(); sourceImg.getHeight(); 2,获取网络图片大小(尺寸) BufferedImage sourceImg=ImageIO.read(new URL(strSrc).openStream()); sourceImg

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

// 获取图片的size CGSize size = [UIImage imageNamed:@"regStep2_sex"].size; 获取网络图片的尺寸: // 根据图片url获取图片尺寸 +(CGSize)getImageSizeWithURL:(id)imageURL { NSURL* URL = nil; if([imageURL isKindOfClass:[NSURL class]]){ URL = imageURL; } if([imageURL isKindOfCl

iOS下载图片之前获取网络图片尺寸的失败尝试

最近一直在找获取网络图片的size的方式,最后得出两个结论: 1 使用分线程下载下来,然后获得图片的size 2 使用网络请求图片的头文件,然后从头文件中找到图片大小的信息 第一种方法需要主线程分线程切换,因为在使用tableView来reloadData的时候,刷表老是出问题,先放着不管 然后我重点是想搞一下第二个方法: 在网上找到了一个博客:http://cxjwin.github.io/2013/11/05/preview_image_size/ 大神写的很不错 主要思路就是先在网上找一个

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

直接上代码了 头文件   // 图片处理 0 半灰色  1 灰度   2 深棕色    3 反色 +(UIImage*)imageWithImage:(UIImage*)image grayLevelType:(UIImageGrayLevelType)type; //色值 变暗多少 0.0 - 1.0 +(UIImage*)imageWithImage:(UIImage*)image darkValue:(float)darkValue; /** 获取网络图片的Size, 先通过文件头来获取图

获取iOS文件夹大小

提供一种获取iOS文件夹大小的方法.没有使用对文件夹内的文件枚举与文件大小字节数的累加. NSURL *cacheDirectory = [[NSFileManager defaultManager] URLForDirectory:NSCachesDirectory inDomain:NSUserDomainMaskappropriateForURL:nil create:NO error:nil]; NSDictionary *attributes = [[NSFileManager def