iOS开发——根据Url 获取图片尺寸

获取远程图片尺寸
本文介绍了一种通过分析图片文件头来获取远程图片尺寸的方法,支持PNG、GIF和JPG格式,有效减少了完整图片下载的需求。
转自:http://www.oschina.net/code/snippet_2248391_53038

// 根据图片url获取图片尺寸
+(CGSize)getImageSizeWithURL:(id)imageURL
{
    NSURL* URL = nil;
    if([imageURL isKindOfClass:[NSURLclass]]){
        URL = imageURL;
    }
    if([imageURL isKindOfClass:[NSStringclass]]){
        URL = [NSURLURLWithString:imageURL];
    }
    if(URL == nil)
        returnCGSizeZero;                  // url不正确返回CGSizeZero
     
    NSMutableURLRequest*request = [[NSMutableURLRequestalloc] initWithURL:URL];
    NSString* pathExtendsion = [URL.pathExtension lowercaseString];
     
    CGSize size = CGSizeZero;
    if([pathExtendsion isEqualToString:@"png"]){
        size =  [selfgetPNGImageSizeWithRequest:request];
    }
    elseif([pathExtendsion isEqual:@"gif"])
    {
        size =  [selfgetGIFImageSizeWithRequest:request];
    }
    else{
        size = [selfgetJPGImageSizeWithRequest:request];
    }
    if(CGSizeEqualToSize(CGSizeZero, size))                    // 如果获取文件头信息失败,发送异步请求请求原图
    {
        NSData* data = [NSURLConnectionsendSynchronousRequest:[NSURLRequestrequestWithURL:URL] returningResponse:nilerror:nil];
        UIImage* image = [UIImageimageWithData:data];
        if(image)
        {
            size = image.size;
        }
    }
    returnsize;
}
//  获取PNG图片的大小
+(CGSize)getPNGImageSizeWithRequest:(NSMutableURLRequest*)request
{
    [request setValue:@"bytes=16-23"forHTTPHeaderField:@"Range"];
    NSData* data = [NSURLConnectionsendSynchronousRequest:request returningResponse:nilerror:nil];
    if(data.length == 8)
    {
        intw1 = 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)];
        intw = (w1 << 24) + (w2 << 16) + (w3 << 8) + w4;
        inth1 = 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)];
        inth = (h1 << 24) + (h2 << 16) + (h3 << 8) + h4;
        returnCGSizeMake(w, h);
    }
    returnCGSizeZero;
}
//  获取gif图片的大小
+(CGSize)getGIFImageSizeWithRequest:(NSMutableURLRequest*)request
{
    [request setValue:@"bytes=6-9"forHTTPHeaderField:@"Range"];
    NSData* data = [NSURLConnectionsendSynchronousRequest:request returningResponse:nilerror:nil];
    if(data.length == 4)
    {
        shortw1 = 0, w2 = 0;
        [data getBytes:&w1 range:NSMakeRange(0, 1)];
        [data getBytes:&w2 range:NSMakeRange(1, 1)];
        shortw = w1 + (w2 << 8);
        shorth1 = 0, h2 = 0;
        [data getBytes:&h1 range:NSMakeRange(2, 1)];
        [data getBytes:&h2 range:NSMakeRange(3, 1)];
        shorth = h1 + (h2 << 8);
        returnCGSizeMake(w, h);
    }
    returnCGSizeZero;
}
//  获取jpg图片的大小
+(CGSize)getJPGImageSizeWithRequest:(NSMutableURLRequest*)request
{
    [request setValue:@"bytes=0-209"forHTTPHeaderField:@"Range"];
    NSData* data = [NSURLConnectionsendSynchronousRequest:request returningResponse:nilerror:nil];
     
    if([data length] <= 0x58) {
        returnCGSizeZero;
    }
     
    if([data length] < 210) {// 肯定只有一个DQT字段
        shortw1 = 0, w2 = 0;
        [data getBytes:&w1 range:NSMakeRange(0x60, 0x1)];
        [data getBytes:&w2 range:NSMakeRange(0x61, 0x1)];
        shortw = (w1 << 8) + w2;
        shorth1 = 0, h2 = 0;
        [data getBytes:&h1 range:NSMakeRange(0x5e, 0x1)];
        [data getBytes:&h2 range:NSMakeRange(0x5f, 0x1)];
        shorth = (h1 << 8) + h2;
        returnCGSizeMake(w, h);
    }else{
        shortword = 0x0;
        [data getBytes:&word range:NSMakeRange(0x15, 0x1)];
        if(word == 0xdb) {
            [data getBytes:&word range:NSMakeRange(0x5a, 0x1)];
            if(word == 0xdb) {// 两个DQT字段
                shortw1 = 0, w2 = 0;
                [data getBytes:&w1 range:NSMakeRange(0xa5, 0x1)];
                [data getBytes:&w2 range:NSMakeRange(0xa6, 0x1)];
                shortw = (w1 << 8) + w2;
                shorth1 = 0, h2 = 0;
                [data getBytes:&h1 range:NSMakeRange(0xa3, 0x1)];
                [data getBytes:&h2 range:NSMakeRange(0xa4, 0x1)];
                shorth = (h1 << 8) + h2;
                returnCGSizeMake(w, h);
            }else{// 一个DQT字段
                shortw1 = 0, w2 = 0;
                [data getBytes:&w1 range:NSMakeRange(0x60, 0x1)];
                [data getBytes:&w2 range:NSMakeRange(0x61, 0x1)];
                shortw = (w1 << 8) + w2;
                shorth1 = 0, h2 = 0;
                [data getBytes:&h1 range:NSMakeRange(0x5e, 0x1)];
                [data getBytes:&h2 range:NSMakeRange(0x5f, 0x1)];
                shorth = (h1 << 8) + h2;
                returnCGSizeMake(w, h);
            }
        }else{
            returnCGSizeZero;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值