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

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;
        }
    }
}
时间: 2024-10-22 19:19:53

检测SDWebImage有没有缓存图片 IOS 获取网络图片大小的相关文章

iOS获取网络图片大小

在iOS开发过程中经常需要通过网络请求加载图片,有时,需要在创建UIImageView或UIButton来显示图片之前需要提前知道图片的尺寸,根据图片尺寸创建对应大小的控件.但是对于网络图片来说,要想通过最优的方法获得尺寸就略微有点困难,大体思路就是下面这种: 如果有使用SDWebImage,则首先检查是否缓存过该图片,如果没有,先通过文件头获取图片大小(针对格式为png.gif.jpg文件获取其尺寸大小),如果获取失败,则下载完整的图片data,然后计算大小,如果有使用SDWebImage,则

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

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

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

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

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

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

iOS 获取网络图片的大小

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

SDWebImage下载和缓存图片(UIImge)

1.用SDWebImage下载图片 #import "SDWebImageManager.h" [[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:@"anurl"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { //处理下载进度 } completed:^(UIImag

iOS网络编程(三) 异步加载及缓存图片----&gt;SDWebImage

@SDWebImage提供一个UIImageView的类别以支持加载来自网络的远程图片.具有缓存管理.异步下载.同一个URL下载次数控制和优化等特征. @SDWebImage的导入1.https://github.com/rs/SDWebImage 下载SDWebImage开源包2.将类包拖入工程,再导入MapKit.framework.ImageIO.framework两个框架3.SDWebImage是支持ARC的,在MRC的工程中要注意,可参考MRC工程配置ARC4.注意:SDWebImag

ios获取缓存文件的大小并清除缓存

移动应用在处理网络资源时,一般都会做离线缓存处理,其中以图片缓存最为典型,其中很流行的离线缓存框架为SDWebImage. 但是,离线缓存会占用手机存储空间,所以缓存清理功能基本成为资讯.购物.阅读类app的标配功能. 今天介绍的离线缓存功能的实现,主要分为缓存文件大小的获取.清除缓存文件的实现. 1. 获取缓存文件的大小-( float )readCacheSize{    NSString *cachePath = [NSSearchPathForDirectoriesInDomains (

iOS 获取图片(拍照,图库,相册)

iOS  获取图片有三种方法 1 直接调用摄像头拍照 2 从相册中选择 3 从图库中选择 UIImagePickerController 是系统提供的用来获取图片和视频的接口: 用UIImagePickerController 类来获取图片视频: 大体分为以下几个步骤: 初始化UIImagePickerController 类 设置UIImagePickerController 实例的数据来源类型(下面解释): 设置设置代理 如果需要做图片修改的话设置allowsEditing =yes 数据