zoukankan      html  css  js  c++  java
  • 获取网络图片的尺寸

    #pragma mark - 获取网络图片的尺寸

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

            }

        }

    }

  • 相关阅读:
    像草一样,朝海生长
    那一次,我们属于彼此
    discuz !NT 3.5 论坛整合 .net 网站用户登录,退出
    oracel 10g 网络服务管理: 主机登录
    断章
    屏蔽浏览器左下角的js错误提示
    IE下载的文件自动加上中括号的Bug解决方案
    oracle下重置用户的所有序列
    循环追加表空间的数据文件的存储过程
    查询所有连接到ORACLE服务器的客户端IP地址的方法
  • 原文地址:https://www.cnblogs.com/HOYF/p/5142819.html
Copyright © 2011-2022 走看看