美文网首页iOS 开发
检测SDWebImage有没有缓存图片 IOS 获取网络图片大小

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

作者: 渣渣程序猿爱次次大餐 | 来源:发表于2015-11-17 15:17 被阅读6376次

NSURL *url = [NSURL URLWithString:[model.content objectForKey:@"image"]];

//请求网络地址数据的同步方法

//因为这个方法在子线程(全局队列)中执行,所以不需要考虑死线程的问题

SDWebImageManager *manager = [SDWebImageManager sharedManager];

[manager diskImageExistsForURL:url];

if ([manager diskImageExistsForURL:url]) {

LOG(@"11111")

self.speakImage = [[manager imageCache] imageFromDiskCacheForKey:url.absoluteString];

}else{

LOG(@"3333333")

NSData *data = [NSData dataWithContentsOfURL:url];

self.speakImage = [UIImage imageWithData:data];

}

IOS 获取网络图片大小

/**

获取网络图片的Size, 先通过文件头来获取图片大小

如果失败 会下载完整的图片Data 来计算大小 所以最好别放在主线程

如果你有使用SDWebImage就会先看下 SDWebImage有缓存过改图片没有

支持文件头大小的格式 png、gif、jpg  http://www.cocoachina.com/bbs/read.php?tid=165823

*/

+(CGSize)downloadImageSizeWithURL:(id)imageURL;

//讨厌警告

-(id)diskImageDataBySearchingAllPathsForKey:(id)key{return nil;}

+(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;

NSString* absoluteString = URL.absoluteString;

#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];

NSString* pathExtendsion = [URL.pathExtension lowercaseString];

CGSize size = CGSizeZero;

if([pathExtendsion isEqualToString:@"png"]){

size =  [self downloadPNGImageSizeWithRequest:request];

}

else if([pathExtendsion isEqual:@"gif"])

{

size =  [self downloadGIFImageSizeWithRequest:request];

}

else{

size = [self downloadJPGImageSizeWithRequest:request];

}

if(CGSizeEqualToSize(CGSizeZero, size))

{

NSData* data = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:URL] returningResponse:nil error:nil];

UIImage* image = [UIImage imageWithData:data];

if(image)

{

#ifdef dispatch_main_sync_safe

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

#endif

size = image.size;

}

}

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;

}

}

}

本文出自 “小刘_Blog” 博客,请务必保留此出处http://liuyafang.blog.51cto.com/8837978/1613458

我是在 http://www.mamicode.com/info-detail-471949.html 找到的

相关文章

网友评论

    本文标题:检测SDWebImage有没有缓存图片 IOS 获取网络图片大小

    本文链接:https://www.haomeiwen.com/subject/lqzkhttx.html