美文网首页iOS开发基础iOS开发iOS 网络相关
iOS开发 - 根据图片URL获取图片的尺寸(宽高)

iOS开发 - 根据图片URL获取图片的尺寸(宽高)

作者: 阿唯不知道 | 来源:发表于2017-07-13 14:53 被阅读3760次

    根据网络图片URL链接获取图片的尺寸(宽高)

    本文并非原创,仅为做一笔记,小怪兽饲养猿原作方法有些许瑕疵,不过在它得评论区已经有热心网友给出了完美的解决方案,所以我就借此整理到我的简书,希望大家见怪莫怪。

    一行代码获取图片尺寸:
    CGSize size = [UIImage getImageSizeWithURL:@"http:https://img.haomeiwen.com/i2822163/70ac87aa2d2199d1.jpg"];
    NSLog(@"%f", size.height);
    

    在使用之前还是要先引入系统的ImageIO.framework库

    UIImage+ImgSize.h 文件

    #import <UIKit/UIKit.h>
    @interface UIImage (ImgSize)
    
    + (CGSize)getImageSizeWithURL:(id)URL;
    
    @end
    
    

    UIImage+ImgSize.m 文件

    #import "UIImage+ImgSize.h"
    #import <ImageIO/ImageIO.h>
    @implementation UIImage (ImgSize)
    
    /**
    *  根据图片url获取网络图片尺寸
    */
    + (CGSize)getImageSizeWithURL:(id)URL{
        NSURL * url = nil;
        if ([URL isKindOfClass:[NSURL class]]) {
            url = URL;
        }
        if ([URL isKindOfClass:[NSString class]]) {
            url = [NSURL URLWithString:URL];
        }
        if (!URL) {
            return CGSizeZero;
        }
        CGImageSourceRef imageSourceRef = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
        CGFloat width = 0, height = 0;
        
        if (imageSourceRef) {
            
            // 获取图像属性
            CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSourceRef, 0, NULL);
            
            //以下是对手机32位、64位的处理
            if (imageProperties != NULL) {
                
                CFNumberRef widthNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelWidth);
                
    #if defined(__LP64__) && __LP64__
                if (widthNumberRef != NULL) {
                    CFNumberGetValue(widthNumberRef, kCFNumberFloat64Type, &width);
                }
                
                CFNumberRef heightNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);
                
                if (heightNumberRef != NULL) {
                    CFNumberGetValue(heightNumberRef, kCFNumberFloat64Type, &height);
                }
    #else
                if (widthNumberRef != NULL) {
                    CFNumberGetValue(widthNumberRef, kCFNumberFloat32Type, &width);
                }
                
                CFNumberRef heightNumberRef = CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);
                
                if (heightNumberRef != NULL) {
                    CFNumberGetValue(heightNumberRef, kCFNumberFloat32Type, &height);
                }
    #endif
                /***************** 此处解决返回图片宽高相反问题 *****************/
                // 图像旋转的方向属性
                NSInteger orientation = [(__bridge NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyOrientation) integerValue];
                CGFloat temp = 0;
                switch (orientation) {  // 如果图像的方向不是正的,则宽高互换
                    case UIImageOrientationLeft: // 向左逆时针旋转90度
                    case UIImageOrientationRight: // 向右顺时针旋转90度
                    case UIImageOrientationLeftMirrored: // 在水平翻转之后向左逆时针旋转90度
                    case UIImageOrientationRightMirrored: { // 在水平翻转之后向右顺时针旋转90度
                        temp = width;
                        width = height;
                        height = temp;
                    }
                        break;
                    default:
                        break;
                }
                /***************** 此处解决返回图片宽高相反问题 *****************/
    
                CFRelease(imageProperties);
            }
            CFRelease(imageSourceRef);
        }
        return CGSizeMake(width, height);
    }
    
    @end
    
    
    有网友提到这个方法应用到cell里面会卡顿,这里给出我的解决方法:
    在拿到需要请求的url数组的时候,就将每个链接的尺寸顺便就给获取出来,然后本地化存储该图片的尺寸,然后再到cell里面根据链接直接在本地取到图片的尺寸,那样在cell里面浏览的时候就不会有卡顿了。
    //获取图片尺寸时先检查是否有缓存(有就不用再获取了)
    if (![[NSUserDefaults standardUserDefaults] objectForKey:url]) {
        //这里拿到每个图片的尺寸,然后计算出每个cell的高度
        CGSize imageSize = [UIImage getImageSizeWithURL:url];
        CGFloat imgH = 0;
        if (imageSize.height > 0) {
            //这里就把图片根据 固定的需求宽度  计算 出图片的自适应高度
            imgH = imageSize.height * (SCREEN_WIDTH - 2 * _spaceX) / imageSize.width;
        }   
        //将最终的自适应的高度 本地化处理
        [[NSUserDefaults standardUserDefaults] setObject:@(imgH) forKey:url];
    }
    
    本文相关资料链接(关于方向问题即宽高相反)

    1、CGImageSource对图像数据读取任务的抽象:
    http://www.tanhao.me/pieces/1019.html
    2、iOS开发中图片方向的获取与更改:
    http://www.cnblogs.com/gaoxiaoniu/p/5329834.html

    以下是图片素材:
    png图片.png jpg图片.jpg gif图片.gif

    Github 地址:https://github.com/90candy/GetImageSizeWithURL

    相关文章

      网友评论

      • 2557cbbf82a9:为什么我的imageSourceRef一直是nil呢?
        阿唯不知道:检查下地址是否正确或者是否网络请求成功呢?
      • 凉秋落尘:我想知道跟UIImage加载网络图片,在获取尺寸有什么区别,因为他很耗时
      • ArchLL:获取图片尺寸很慢,还需优化,特别是几张图片以上的时候,推荐使用SDWebImage
      • L柠_檬:有的图片宽高会反~
        L柠_檬:@24_see 👌~我再看下
        24_see:解决了,加一个图片旋转方向的判断校正一下就好了
        24_see:解决了吗,确实会反有的
      • GemShi:想问楼主,崩溃在CFRelease(imageSourceRef);倒数第二句怎么回事,bad_access,这个怎么解决?
        GemShi:已解决 32位机 64位机问题
      • 楚天pt:url 是有值的,CGImageSourceCreateWithURL return nil 楼主能解答一下吗?
        阿唯不知道:此问题归档,已解决
        eagleyz:@阿唯不知道 我遇到和这个同样的问题,传入你这个url ,然后CGImageSourceCreateWithURL 还是空
        阿唯不知道:这个... 你是传入的什么图片链接呢?比如你传入一个http://upload.jianshu.io/collections/images/546902/QQ20171013-100604_2x.png
        看看返回的是什么呢
      • JohnQ:为什么我再百度中随便找到一张图获取不到大小啊
        阿唯不知道:@JohnQ 不好意思啊 在外面游玩 暂时没法帮你测试哦
      • shewa_fly:完美解决我的问题 感谢!
        阿唯不知道:@wenhao_fly 哈哈ヾノ≧∀≦)o 恭喜!

      本文标题:iOS开发 - 根据图片URL获取图片的尺寸(宽高)

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