美文网首页iosiOS之绘图动画iOS之功能细节
iOS ImageIO框架详解(获取图片Exif信息及修改GPS

iOS ImageIO框架详解(获取图片Exif信息及修改GPS

作者: 半岛夏天 | 来源:发表于2019-07-05 13:19 被阅读0次

    一、引言

    ImageIO框架提供了读取与写入图片数据的基本方法,使用它可以直接获取到图片文件的内容数据,ImageIO框架中包含6个头文件,其中完成主要功能的是前两个头文件中定义的方法:

    1.CGImageSource.h:负责读取图片数据。

    2.CGImageDestination.h:负责写入图片数据。

    3.CGImageMetadata.h:图片文件元数据类。

    4.CGImageProperties:定义了框架中使用的字符串常量和宏。

    5.ImageIOBase.h:预处理逻辑,无需关心。

    二、CGImageSource详解

    CGImageSource类的主要作用是用来读取图片数据,在平时开发中,关于图片我们使用的最多的可能是UIImage类,UIImage是iOS系统UI系统中用于构建图像对象的类,但是其中只有图像数据,实际上一个图片文件中存储的除了图片数据外,还有一些地理位置、设备类型、时间等信息,除此之外,一个图片文件中可能存储的也不只一张图像(例如gif文件)。CGImageSource就是这样的一个抽象图片数据示例,从其中可以获取到我们所关心的所有数据。

    读取图片文件数据,并将其展示在视图的简单代码示例如下:

    //获取图片文件路径
    NSString * path = [[NSBundle mainBundle]pathForResource:@"timg" ofType:@"jpeg"];
    NSURL * url = [NSURL fileURLWithPath:path];
    CGImageRef myImage = NULL;
    CGImageSourceRef myImageSource;
    //通过文件路径创建CGImageSource对象
    myImageSource = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
    //获取第一张图片
    myImage = CGImageSourceCreateImageAtIndex(myImageSource,
                                              0,
                                              NULL);
    CFRelease(myImageSource);
    UIImageView * image = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 200, 200)];
    image.image = [UIImage imageWithCGImage:myImage];
    [self.view addSubview:image];
    

    上面的示例代码采用的是本地的一个素材文件,当然通过网络图片链接也是可以创建CGImageSource独享的。除了通过URL链接的方式创建对象,ImageIO框架中还提供了两种方法,解析如下:

    //通过数据提供器创建CGImageSource对象
    /*
    CGDataProviderRef是CoreGraphics框架中的一个数据读取类,其也可以通过Data数据,URL和文件名来创建
    */
    CGImageSourceRef __nullable CGImageSourceCreateWithDataProvider(CGDataProviderRef __nonnull provider, CFDictionaryRef __nullable options);
    //通过Data数据创建CGImageSource对象
    CGImageSourceRef __nullable CGImageSourceCreateWithData(CFDataRef __nonnull data, CFDictionaryRef __nullable options);
    

    需要注意,上面所提到的所有创建CGImageSource的方法中都可以传入一个CFDictionaryRef类型的字典,可以配置的键值意义如下:

    /*
    设置一个预期的图片文件格式,需要设置为字符串类型的值
    */
    const CFStringRef kCGImageSourceTypeIdentifierHint;
    /*
    设置是否以解码的方式读取图片数据 默认为kCFBooleanTrue
    如果设置为true,在读取数据时就进行解码 如果为false 则在渲染时才进行解码
    */
    const CFStringRef kCGImageSourceShouldCache;
    /*
    返回CGImage对象时是否允许使用浮点值 默认为kCFBooleanFalse
    */
    const CFStringRef kCGImageSourceShouldAllowFloa;
    /*
    设置如果不存在缩略图则创建一个缩略图,缩略图的尺寸受开发者设置影响,如果不设置尺寸极限,则为图片本身大小
    默认为kCFBooleanFalse
    */
    const CFStringRef kCGImageSourceCreateThumbnailFromImageIfAbsent;
    /*
    设置是否创建缩略图,无论原图像有没有包含缩略图kCFBooleanFalse
    */
    const CFStringRef kCGImageSourceCreateThumbnailFromImageAlways;
    /*
    设置缩略图的宽高尺寸 需要设置为CFNumber值
    */
    const CFStringRef kCGImageSourceThumbnailMaxPixelSize;
    /*
    设置缩略图是否进行Transfrom变换
    */
    const CFStringRef kCGImageSourceCreateThumbnailWithTransform;
    

    CGImageSource类中其他方法解析如下:

    //获取CGImageSource类在CoreFundation框架中的id
    CFTypeID CGImageSourceGetTypeID (void);
    //获取所支持的图片格式数组
    CFArrayRef __nonnull CGImageSourceCopyTypeIdentifiers(void);
    //获取CGImageSource对象的图片格式
    CFStringRef __nullable CGImageSourceGetType(CGImageSourceRef __nonnull isrc);
    //获取CGImageSource中的图片张数 不包括缩略图
    size_t CGImageSourceGetCount(CGImageSourceRef __nonnull isrc);
    //获取CGImageSource的文件信息
    /*
    字典参数可配置的键值对与创建CGImageSource所传参数意义一致
    返回的字典中的键值意义后面介绍
    */
    CFDictionaryRef __nullable CGImageSourceCopyProperties(CGImageSourceRef __nonnull isrc, CFDictionaryRef __nullable options);
    //获取CGImageSource中某个图像的附加数据
    /*
    index参数设置获取第几张图像 options参数可配置的键值对与创建CGImageSource所传参数意义一致
    返回的字典中的键值意义后面介绍
    */
    CFDictionaryRef __nullable CGImageSourceCopyPropertiesAtIndex(CGImageSourceRef __nonnull isrc, size_t index, CFDictionaryRef __nullable options);
    //获取图片的元数据信息 CGImageMetadataRef类是图像原数据的抽象
    CGImageMetadataRef __nullable CGImageSourceCopyMetadataAtIndex (CGImageSourceRef __nonnull isrc, size_t index, CFDictionaryRef __nullable options);
    //获取CGImageSource中的图片数据
    CGImageRef __nullable CGImageSourceCreateImageAtIndex(CGImageSourceRef __nonnull isrc, size_t index, CFDictionaryRef __nullable options);
    //删除一个指定索引图像的缓存
    void CGImageSourceRemoveCacheAtIndex(CGImageSourceRef __nonnull isrc, size_t index);
    //获取某一帧图片的缩略图
    CGImageRef __nullable CGImageSourceCreateThumbnailAtIndex(CGImageSourceRef __nonnull isrc, size_t index, CFDictionaryRef __nullable options);
    //创建一个空的CGImageSource容器,逐步加载大图片
    CGImageSourceRef __nonnull CGImageSourceCreateIncremental(CFDictionaryRef __nullable options);
    //使用新的数据更新CGImageSource容器
    void CGImageSourceUpdateData(CGImageSourceRef __nonnull isrc, CFDataRef __nonnull data, bool final);
    //更新数据提供器来填充CGImageSource容器
    void CGImageSourceUpdateDataProvider(CGImageSourceRef __nonnull isrc, CGDataProviderRef __nonnull provider, bool final);
    //获取当前CGImageSource的状态
    /*
    CGImageSourceStatus枚举意义:
    typedef CF_ENUM(int32_t, CGImageSourceStatus) {
        kCGImageStatusUnexpectedEOF = -5, //文件结尾出错
        kCGImageStatusInvalidData = -4,   //数据无效
        kCGImageStatusUnknownType = -3,   //未知的图片类型
        kCGImageStatusReadingHeader = -2, //读标题过程中
        kCGImageStatusIncomplete = -1,    //操作不完整
        kCGImageStatusComplete = 0        //操作完整
    };
    */
    CGImageSourceStatus CGImageSourceGetStatus(CGImageSourceRef __nonnull isrc);
    //同上,获取某一个图片的状态
    CGImageSourceStatus CGImageSourceGetStatusAtIndex(CGImageSourceRef __nonnull isrc, size_t index);
    

    三、CGImageDestination详解

    CGImageSource是图片文件数据的抽象对象,而CGImageDestination的作用则是将抽象的图片数据写入指定的目标中。将图片写成文件示例如下:

    //创建存储路径
    NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
    NSString *newPath = [paths.firstObject stringByAppendingPathComponent:[NSString stringWithFormat:@"image.png"]];
    CFURLRef URL =  CFURLCreateWithFileSystemPath (
                                       kCFAllocatorDefault,
                                       (CFStringRef)newPath,
                                       kCFURLPOSIXPathStyle, 
                                       false);
    //创建CGImageDestination对象
    CGImageDestinationRef myImageDest = CGImageDestinationCreateWithURL(URL,CFSTR("public.png"), 1, NULL);
    UIImage * image = [UIImage imageNamed:@"timg.jpeg"];
    //写入图片
    CGImageDestinationAddImage(myImageDest, image.CGImage, NULL);
    CGImageDestinationFinalize(myImageDest);
    CFRelease(myImageDest);
    

    同样,除了可以直接将图片数据写入url外,也可以Data数据或数据消费器,方法如下:

    //将图片数据写入数据消费者
    CGImageDestinationRef __nullable CGImageDestinationCreateWithDataConsumer(CGDataConsumerRef __nonnull consumer, CFStringRef __nonnull type, size_t count, CFDictionaryRef __nullable options);
    //将图片数据写入Data
    CGImageDestinationRef __nullable CGImageDestinationCreateWithData(CFMutableDataRef __nonnull data, CFStringRef __nonnull type, size_t count, CFDictionaryRef __nullable options);
    

    需要注意,上面方法的type参数设置写入数据的文件格式,必须为ImageIO框架所支持的格式,前面有方法可以获取所有支持的格式,还有一点,这3个写入方法的中options参数目前并没有什么作用,其是留给未来使用的,目前传入NULL即可。

    CGImageDestination类中的其他方法解析如下:

    //获取CGImageDestination的CFTypeID
    CFTypeID CGImageDestinationGetTypeID(void);
    //获取CGImageDestination所支持的图片文件类型
    /*
    目前支持如下:iOS10.1
     (
        "public.jpeg",
        "public.png",
        "com.compuserve.gif",
        "public.tiff",
        "public.jpeg-2000",
        "com.microsoft.ico",
        "com.microsoft.bmp",
        "com.adobe.photoshop-image",
        "com.adobe.pdf",
        "com.truevision.tga-image",
        "com.ilm.openexr-image",
        "public.pbm",
        "public.pvr",
        "org.khronos.astc",
        "org.khronos.ktx",
        "com.microsoft.dds",
        "com.apple.rjpeg"
    )
    */
    CFArrayRef __nonnull CGImageDestinationCopyTypeIdentifiers(void);
    //设置图片文件属性
    /*
    可以设置的键值对意义如下:
    const CFStringRef kCGImageDestinationLossyCompressionQuality; //设置压缩质量 0-1之间的cfnumberref值
    const CFStringRef kCGImageDestinationBackgroundColor;  //将图片数据写为无alpha通道时的默认背景色 cgcolor值
    */
    void CGImageDestinationSetProperties(CGImageDestinationRef __nonnull idst, CFDictionaryRef __nullable properties);
    //向CGImageDestination中添加一张图片 其中的option参数意义和上面一致,设置此图片的质量与无alpha默认背景色
    void CGImageDestinationAddImage(CGImageDestinationRef __nonnull idst, CGImageRef __nonnull image, CFDictionaryRef __nullable properties);
    //通过CGImageSource对象来向CGImageDestination中添加图片
    void CGImageDestinationAddImageFromSource(CGImageDestinationRef __nonnull idst, CGImageSourceRef __nonnull isrc, size_t index, CFDictionaryRef __nullable properties);
    //进行写入操作 执行此方法后 不可以在写入其他信息
    bool CGImageDestinationFinalize(CGImageDestinationRef __nonnull idst);
    //添加图片元信息
    void CGImageDestinationAddImageAndMetadata(CGImageDestinationRef __nonnull idst, CGImageRef __nonnull image, CGImageMetadataRef __nullable metadata, CFDictionaryRef __nullable options);
    //将CGImageSource信息拷贝进CGImageDestination
    /*
    options参数可以用来添加元信息
    */
    bool CGImageDestinationCopyImageSource(CGImageDestinationRef __nonnull idst, CGImageSourceRef __nonnull isrc, CFDictionaryRef __nullable options, __nullable CFErrorRef * __nullable err);
    

    上面列举的方法中,CGImageDestinationCopyImageSource()方法中的options参数可以添加一些图片的元信息,可以设置的键值对意义如下:

    //设置元信息 需要设置为CGImageMetadataRef对象
    const CFStringRef kCGImageDestinationMetadata;
    //是否将CGImageSource的元信息信息合并操作 默认为kCFBooleanFalse
    const CFStringRef kCGImageDestinationMergeMetadata;
    //XMP数据是否不被写入 默认为kCFBooleanFalse
    const CFStringRef kCGImageMetadataShouldExcludeXMP;
    //GPS信息是否不被写入 默认为kCFBooleanFalse
    const CFStringRef kCGImageMetadataShouldExcludeGPS;
    //更新元数据的时间值 需要设置为CFStringRef或者CFDateRef
    const CFStringRef kCGImageDestinationDateTime;
    //更新元数据的方向值 需要设置为NSNumber1-8
    const CFStringRef kCGImageDestinationOrientation;
    

    四、关于CGImageMetadata

    前面我们很多次提到元数据,CGImageMetadata类就是元数据的抽象,其中封装了一些方法供开发者读取或写入元数据信息。奇怪的是Apple的官方文档与API文档中并没有CGImageMetadata的介绍与解释,博客中本部分的内容,多出自我的理解,有疏漏和不对的地方,清楚的朋友可以指点与建议。

    前边介绍,CGImageSource中有获取图片元数据的方法,CGImageDestination中也有写入图片元数据的方法,元数据中抽象出的CGImageMetadataTag是对具体数据内容的封装。CGImageMetadata解析如下:
    
    //获取CGImageMetadata类的CFTypeID
    CFTypeID CGImageMetadataGetTypeID(void);
    //创建一个空的可变的CGImageMetadata对象
    CGMutableImageMetadataRef __nonnull CGImageMetadataCreateMutable(void);
    //拷贝一个可变的CGImageMetadata对象
    CGMutableImageMetadataRef __nullable CGImageMetadataCreateMutableCopy(CGImageMetadataRef __nonnull metadata);
    //获取CGImageMetadataTag类的CFTypeID
    CFTypeID CGImageMetadataTagGetTypeID(void);
    //创建一个CGImageMetadataTag对象
    /*
    这个方法比较复杂
    xmlns参数设置命名空间
    prefix参数设置命名空间的缩写或前缀
    name参数设置CGImageMetadataTag的名称
    type参数设置CGImageMetadataTag对应值的类型
    value参数设置CGImageMetadataTag的对应值
    */
    CGImageMetadataTagRef __nullable CGImageMetadataTagCreate (CFStringRef __nonnull xmlns, CFStringRef __nullable prefix, CFStringRef __nonnull name, CGImageMetadataType type, CFTypeRef __nonnull value);
    

    上面创建CGImageMetadataTag的方法中,xmlns设置命名空间,必须使用一个预定义的命名空间或者自定义的命名空间,对于自定义的命名空间,必须遵守Adobe的XMP规范。一些共用的命名空间定义如下:

    //Exif命名空间
    const CFStringRef  kCGImageMetadataNamespaceExif;
    //ExifAux命名空间
    const CFStringRef  kCGImageMetadataNamespaceExifAux;
    //ExifEX命名空间
    const CFStringRef  kCGImageMetadataNamespaceExifEX;
    //DublineCore命名空间
    const CFStringRef  kCGImageMetadataNamespaceDublinCore;
    //IPTCCore命名空间
    const CFStringRef  kCGImageMetadataNamespaceIPTCCore;
    //Photoshop命名空间
    const CFStringRef  kCGImageMetadataNamespacePhotoshop;
    //TIFF命名空间
    const CFStringRef  kCGImageMetadataNamespaceTIFF;
    //XMPBasic命名空间
    const CFStringRef  kCGImageMetadataNamespaceXMPBasic;
    //XMPRights命名空间
    const CFStringRef  kCGImageMetadataNamespaceXMPRights;
    

    上面创建CGImageMetadataTag的方法中prefix设置命名空间缩写或前缀,同样一些公用的前缀定义如下:

    //Exif命名空间前缀
    const CFStringRef  kCGImageMetadataPrefixExif;
    //ExifAux命名空间前缀
    const CFStringRef  kCGImageMetadataPrefixExifAux;
    //ExifEX命名空间前缀
    const CFStringRef  kCGImageMetadataPrefixExifEX;
    //DublinCore命名空间前缀
    const CFStringRef  kCGImageMetadataPrefixDublinCore;
    //IPCCore命名空间前缀
    const CFStringRef  kCGImageMetadataPrefixIPTCCore;
    //Photoshop命名空间前缀
    const CFStringRef  kCGImageMetadataPrefixPhotoshop;
    //TIFF命名空间前缀
    const CFStringRef  kCGImageMetadataPrefixTIFF;
    //XMPBasic命名空间前缀
    const CFStringRef  kCGImageMetadataPrefixXMPBasic;
    //XMPRights命名空间前缀
    const CFStringRef  kCGImageMetadataPrefixXMPRights;
    

    上面创建CGImageMetadataTag的方法中type设置对应值的类型,其是一个CGImageMetadataType类型的枚举,意义如下:

    typedef CF_ENUM(int32_t, CGImageMetadataType) {
        //无效的数据类型
        kCGImageMetadataTypeInvalid = -1,
        //基本的CFType类型
        kCGImageMetadataTypeDefault = 0,
        //字符串类型
        kCGImageMetadataTypeString = 1,
        //无需集合类型
        kCGImageMetadataTypeArrayUnordered = 2,
        //有序集合类型
        kCGImageMetadataTypeArrayOrdered = 3,
        //有序阵列
        kCGImageMetadataTypeAlternateArray = 4,
        //特殊的数组 其中元素进行不同的本地化
        kCGImageMetadataTypeAlternateText = 5,
        //结构类型 如字典
        kCGImageMetadataTypeStructure = 6
    };
    

    获取到CGImageMetadataTag后,可以通过如下方法来获取其中封装的信息:

    //获取标签的命名空间
    CFStringRef __nullable CGImageMetadataTagCopyNamespace(CGImageMetadataTagRef __nonnull tag);
    //获取标签的命名空间前缀
    CFStringRef __nullable CGImageMetadataTagCopyPrefix(CGImageMetadataTagRef __nonnull tag);
    //获取标签名称
    CFStringRef __nullable CGImageMetadataTagCopyName(CGImageMetadataTagRef __nonnull tag);
    //获取标签的值
    CFTypeRef __nullable CGImageMetadataTagCopyValue(CGImageMetadataTagRef __nonnull tag);
    //获取标签值的类型
    CGImageMetadataType CGImageMetadataTagGetType(CGImageMetadataTagRef __nonnull tag);
    //获取标签的Qualifier数组
    CFArrayRef __nullable CGImageMetadataTagCopyQualifiers(CGImageMetadataTagRef __nonnull tag);
    

    下面这些方法用于向CGImageMetadata中添加标签或者获取标签:

    //获取CGImageMetadata中的所有标签
    CFArrayRef __nullable CGImageMetadataCopyTags(CGImageMetadataRef __nonnull metadata);
    //通过路径查找特殊的标签
    CGImageMetadataTagRef __nullable CGImageMetadataCopyTagWithPath(CGImageMetadataRef __nonnull metadata, CGImageMetadataTagRef __nullable parent, CFStringRef __nonnull path);
    //通过路径查找特殊标签的值
     CFStringRef __nullable CGImageMetadataCopyStringValueWithPath(CGImageMetadataRef __nonnull metadata, CGImageMetadataTagRef __nullable parent, CFStringRef __nonnull path);
    //为一个前缀注册一个命名空间
    bool CGImageMetadataRegisterNamespaceForPrefix(CGMutableImageMetadataRef __nonnull metadata, CFStringRef __nonnull xmlns, CFStringRef __nonnull prefix, __nullable CFErrorRef * __nullable err);
    //通过路径为CGImageMetadata设置标签
    bool CGImageMetadataSetTagWithPath(CGMutableImageMetadataRef __nonnull metadata, CGImageMetadataTagRef __nullable parent, CFStringRef __nonnull path, CGImageMetadataTagRef __nonnull tag);
    //通过路径为CGImageMetadata设置标签的值
    bool CGImageMetadataSetValueWithPath(CGMutableImageMetadataRef __nonnull metadata, CGImageMetadataTagRef __nullable parent, CFStringRef __nonnull path, CFTypeRef __nonnull value);
    //通过路径移除一个标签
    bool CGImageMetadataRemoveTagWithPath(CGMutableImageMetadataRef __nonnull metadata,  CGImageMetadataTagRef __nullable parent, CFStringRef __nonnull path);
    //对标签进行枚举
    void CGImageMetadataEnumerateTagsUsingBlock(CGImageMetadataRef __nonnull metadata, CFStringRef __nullable rootPath, CFDictionaryRef __nullable options, CGImageMetadataTagBlock __nonnull block);
    

    五、CGImageProperties中定义的字典意义

    前面提到的CGImageSourceCopyProperties方法与CGImageSourceCopyPropertiesAtIndex方法都会返回一个字典,字典中可能包含如下有意义的键:

    //TIFF信息字典
    const CFStringRef kCGImagePropertyTIFFDictionary;
    /GIF信息字典
    const CFStringRef kCGImagePropertyGIFDictionary;
    //JFIF信息字典
    const CFStringRef kCGImagePropertyJFIFDictionary;
    //EXif信息字典
    const CFStringRef kCGImagePropertyExifDictionary;
    //PNG信息字典
    const CFStringRef kCGImagePropertyPNGDictionary;
    //IPTC信息字典
    const CFStringRef kCGImagePropertyIPTCDictionary;
    //GPS信息字典
    const CFStringRef kCGImagePropertyGPSDictionary;
    //原始信息字典
    const CFStringRef kCGImagePropertyRawDictionary;
    //CIFF信息字典
    const CFStringRef kCGImagePropertyCIFFDictionary;
    //佳能相机信息字典
    const CFStringRef kCGImagePropertyMakerCanonDictionary;
    //尼康相机信息字典
    const CFStringRef kCGImagePropertyMakerNikonDictionary;
    //柯尼卡相机信息字典
    const CFStringRef kCGImagePropertyMakerMinoltaDictionary;
    //富士相机信息字典
    const CFStringRef kCGImagePropertyMakerFujiDictionary;
    //奥林巴斯相机信息字典
    const CFStringRef kCGImagePropertyMakerOlympusDictionary;
    //宾得相机信息字典
    const CFStringRef kCGImagePropertyMakerPentaxDictionary;
    //对应Photoshop相片的信息字典
    const CFStringRef kCGImageProperty8BIMDictionary;
    //NDG信息字典
    const CFStringRef kCGImagePropertyDNGDictionary ;
    //ExifAux信息字典
    const CFStringRef kCGImagePropertyExifAuxDictionary;
    //OpenEXR信息字典
    const CFStringRef kCGImagePropertyOpenEXRDictionary;
    //Apple相机信息字典
    const CFStringRef kCGImagePropertyMakerAppleDictionary ;
    

    CGImageSourceCopyProperties方法返回的字典中还可能会有如下一个特殊的键:

    //对应文件大小
    const CFStringRef kCGImagePropertyFileSize;
    

    CGImageSourceCopyPropertiesAtIndex方法中可能包含的特殊键:

    //像素高度
    const CFStringRef kCGImagePropertyPixelHeight;
    //像素宽度
    const CFStringRef kCGImagePropertyPixelWidth;
    //DPI高度
    const CFStringRef kCGImagePropertyDPIHeight;
    //DPI宽度
    const CFStringRef kCGImagePropertyDPIWidth;
    //颜色位数
    const CFStringRef kCGImagePropertyDepth;
    //图片的显示方向
    /*
    对应Number值
     *   1  =  左上到右下.  
     *   2  =  右上到左下.  
     *   3  =  右下到左上.
     *   4  =  左下到右上.  
     *   5  =  行列置换 左上到右下.  
     *   6  =  行列置换 右上到左下.  
     *   7  =  行列置换 右下到左上.  
     *   8  =  行列置换 左下到右上.
    */
    const CFStringRef kCGImagePropertyOrientation;
    //颜色是否支持浮点数
    const CFStringRef kCGImagePropertyIsFloat;
    //图像是否包含像素样本
    const CFStringRef kCGImagePropertyIsIndexed;
    //图像是否包含alpha通道
    const CFStringRef kCGImagePropertyHasAlpha;
    //图像的颜色模式
    const CFStringRef kCGImagePropertyColorModel;
    //嵌入图片的ICC配置文件名称
    const CFStringRef kCGImagePropertyProfileName;
    

    kCGImagePropertyColorModel键可返回的值有如下几种定义:

    //RBG模式
    const CFStringRef kCGImagePropertyColorModelRGB;
    //Gray模式
    const CFStringRef kCGImagePropertyColorModelGray;
    //CMYK模式
    const CFStringRef kCGImagePropertyColorModelCMYK;
    //Lab模式
    const CFStringRef kCGImagePropertyColorModelLab;
    

    kCGImagePropertyTIFFDictionary键可返回的值定义如下:

    //图片数据压缩方案
    const CFStringRef kCGImagePropertyTIFFCompression;
    //图片数据的色彩空间
    const CFStringRef kCGImagePropertyTIFFPhotometricInterpretation;
    //文档名称
    const CFStringRef kCGImagePropertyTIFFDocumentName;
    //图片描述
    const CFStringRef kCGImagePropertyTIFFImageDescription;
    //相机设备名
    const CFStringRef kCGImagePropertyTIFFMake;
    //相机设备模式
    const CFStringRef kCGImagePropertyTIFFModel;
    //图片方向
    const CFStringRef kCGImagePropertyTIFFOrientation;
    //横向每个分辨位的像素数
    const CFStringRef kCGImagePropertyTIFFXResolution;
    //纵向每个分辨位的像素数
    const CFStringRef kCGImagePropertyTIFFYResolution;
    //分辨率单位
    const CFStringRef kCGImagePropertyTIFFResolutionUnit;
    //创建图像的软件名称和版本
    const CFStringRef kCGImagePropertyTIFFSoftware;
    //transform函数
    const CFStringRef kCGImagePropertyTIFFTransferFunction;
    //日期时间
    const CFStringRef kCGImagePropertyTIFFDateTime;
    //作者
    const CFStringRef kCGImagePropertyTIFFArtist;
    //创建图片的电脑系统
    const CFStringRef kCGImagePropertyTIFFHostComputer;
    //公司信息
    const CFStringRef kCGImagePropertyTIFFCopyright;
    //图片的白点
    const CFStringRef kCGImagePropertyTIFFWhitePoint;
    //图像的原色色度
    const CFStringRef kCGImagePropertyTIFFPrimaryChromaticities;
    //图片的瓦片宽度
    const CFStringRef kCGImagePropertyTIFFTileWidth;
    //图片的瓦片高度
    const CFStringRef kCGImagePropertyTIFFTileLength;
    

    kCGImagePropertyJFIFDictionary对应的字典中可能包含如下意义的键:

    //JFIF版本
    const CFStringRef kCGImagePropertyJFIFVersion;
    //横向像素密度
    const CFStringRef kCGImagePropertyJFIFXDensity;
    //纵向像素密度
    const CFStringRef kCGImagePropertyJFIFYDensity;
    //像素密度单元
    const CFStringRef kCGImagePropertyJFIFDensityUnit;
    //是否是高质量图像版本
    const CFStringRef kCGImagePropertyJFIFIsProgressive;
    

    kCGImagePropertyExifDictionary对应的字典中可能包含如下意义的键 :

    //曝光时间
    const CFStringRef kCGImagePropertyExifExposureTime;
    //ExifNumber
    const CFStringRef kCGImagePropertyExifFNumber;
    //曝光程序
    const CFStringRef kCGImagePropertyExifExposureProgram;
    //每个通道的光谱灵敏度
    const CFStringRef kCGImagePropertyExifSpectralSensitivity;
    //ISO速度等级
    const CFStringRef kCGImagePropertyExifISOSpeedRatings;
    //ExifOECF
    const CFStringRef kCGImagePropertyExifOECF;
    //灵敏类型
    const CFStringRef kCGImagePropertyExifSensitivityType;
    //输出灵敏标准
    const CFStringRef kCGImagePropertyExifStandardOutputSensitivity;
    //推荐曝光指数
    const CFStringRef kCGImagePropertyExifRecommendedExposureIndex;
    //ISO速率
    const CFStringRef kCGImagePropertyExifISOSpeed;
    const CFStringRef kCGImagePropertyExifISOSpeedLatitudeyyy;
    const CFStringRef kCGImagePropertyExifISOSpeedLatitudezzz;
    //Exif版本
    const CFStringRef kCGImagePropertyExifVersion;
    //原始日期时间
    const CFStringRef kCGImagePropertyExifDateTimeOriginal;
    //数字化日期时间
    const CFStringRef kCGImagePropertyExifDateTimeDigitized;
    //压缩配置
    const CFStringRef kCGImagePropertyExifComponentsConfiguration;
    //压缩模式像素位
    const CFStringRef kCGImagePropertyExifCompressedBitsPerPixel;
    //快门速度值
    const CFStringRef kCGImagePropertyExifShutterSpeedValue;
    //孔径值
    const CFStringRef kCGImagePropertyExifApertureValue;
    //亮度值
    const CFStringRef kCGImagePropertyExifBrightnessValue;
    //曝光偏差值
    const CFStringRef kCGImagePropertyExifExposureBiasValue;
    //最大光圈值
    const CFStringRef kCGImagePropertyExifMaxApertureValue;
    //距离
    const CFStringRef kCGImagePropertyExifSubjectDistance;
    //测光模式
    const CFStringRef kCGImagePropertyExifMeteringMode;
    //光源
    const CFStringRef kCGImagePropertyExifLightSource;
    //拍摄时的闪光状态
    const CFStringRef kCGImagePropertyExifFlash;
    //焦距
    const CFStringRef kCGImagePropertyExifFocalLength;
    //主体区域
    const CFStringRef kCGImagePropertyExifSubjectArea;
    //相机制造商指定的信息
    const CFStringRef kCGImagePropertyExifMakerNote;
    //用户信息
    const CFStringRef kCGImagePropertyExifUserComment;
    //日期和时间标记的秒分数
    const CFStringRef kCGImagePropertyExifSubsecTime;
    //原始时间
    const CFStringRef kCGImagePropertyExifSubsecTimeOriginal;
    //数字时间
    const CFStringRef kCGImagePropertyExifSubsecTimeDigitized;
    //FlashPix版本信息
    const CFStringRef kCGImagePropertyExifFlashPixVersion;
    //色彩空间
    const CFStringRef kCGImagePropertyExifColorSpace;
    //X方向像素
    const CFStringRef kCGImagePropertyExifPixelXDimension;
    //Y方向像素
    const CFStringRef kCGImagePropertyExifPixelYDimension;
    //与图像相关的声音文件
    const CFStringRef kCGImagePropertyExifRelatedSoundFile;
    //FlashEnergy
    const CFStringRef kCGImagePropertyExifFlashEnergy;
    //FrequencyResponse
    const CFStringRef kCGImagePropertyExifSpatialFrequencyResponse;
    //像素数目
    const CFStringRef kCGImagePropertyExifFocalPlaneXResolution;
    const CFStringRef kCGImagePropertyExifFocalPlaneYResolution;
    const CFStringRef kCGImagePropertyExifFocalPlaneResolutionUnit;
    //图像主体的位置
    const CFStringRef kCGImagePropertyExifSubjectLocation;
    //选择的曝光指数
    const CFStringRef kCGImagePropertyExifExposureIndex;
    //传感器类型
    const CFStringRef kCGImagePropertyExifSensingMethod;
    //图像文件源
    const CFStringRef kCGImagePropertyExifFileSource;
    //场景类型
    const CFStringRef kCGImagePropertyExifSceneType;
    //CFA模块
    const CFStringRef kCGImagePropertyExifCFAPattern;
    //对图像数据进行特殊渲染
    const CFStringRef kCGImagePropertyExifCustomRendered;
    //曝光模式设置
    const CFStringRef kCGImagePropertyExifExposureMode;
    //白平衡模式
    const CFStringRef kCGImagePropertyExifWhiteBalance;
    //数字变焦比
    const CFStringRef kCGImagePropertyExifDigitalZoomRatio;
    //35毫米胶片的等效焦距
    const CFStringRef kCGImagePropertyExifFocalLenIn35mmFilm;
    //场景捕捉类型(标准,景观,肖像,夜晚)
    const CFStringRef kCGImagePropertyExifSceneCaptureType;
    //图像增益
    const CFStringRef kCGImagePropertyExifGainControl;
    //图像对比度
    const CFStringRef kCGImagePropertyExifContrast;
    //图像饱和度
    const CFStringRef kCGImagePropertyExifSaturation;
    //图像锐度
    const CFStringRef kCGImagePropertyExifSharpness;
    //拍摄条件
    const CFStringRef kCGImagePropertyExifDeviceSettingDescription;
    //主体距离
    const CFStringRef kCGImagePropertyExifSubjectDistRange;
    //图像的唯一标识
    const CFStringRef kCGImagePropertyExifImageUniqueID;
    //相机所有者
    const CFStringRef kCGImagePropertyExifCameraOwnerName;
    //相机序列号
    const CFStringRef kCGImagePropertyExifBodySerialNumber;
    //透镜规格信息
    const CFStringRef kCGImagePropertyExifLensSpecification;
    //透镜制造商名称
    const CFStringRef kCGImagePropertyExifLensMake;
    //透镜模式
    const CFStringRef kCGImagePropertyExifLensModel;
    //透镜序列号
    const CFStringRef kCGImagePropertyExifLensSerialNumber;
    //伽马设置
    const CFStringRef kCGImagePropertyExifGamma;
    

    kCGImagePropertyExifAuxDictionary对应的字典中可能包含的键定义如下:

    //镜头信息
    const CFStringRef kCGImagePropertyExifAuxLensInfo;
    //镜头模式
    const CFStringRef kCGImagePropertyExifAuxLensModel;
    //序列号
    const CFStringRef kCGImagePropertyExifAuxSerialNumber;
    //镜头ID
    const CFStringRef kCGImagePropertyExifAuxLensID;
    //镜头序列号
    const CFStringRef kCGImagePropertyExifAuxLensSerialNumber;
    //图片编号
    const CFStringRef kCGImagePropertyExifAuxImageNumber;
    //闪光补偿
    const CFStringRef kCGImagePropertyExifAuxFlashCompensation;
    //所有者名称
    const CFStringRef kCGImagePropertyExifAuxOwnerName;
    //固件信息
    const CFStringRef kCGImagePropertyExifAuxFirmware;
    

    kCGImagePropertyGIFDictionary对应的字典中可能包含的键定义如下:

    //动画循环次数
    const CFStringRef kCGImagePropertyGIFLoopCount;
    //两帧之间的延时
    const CFStringRef kCGImagePropertyGIFDelayTime;
    //颜色Map
    const CFStringRef kCGImagePropertyGIFImageColorMap;
    const CFStringRef kCGImagePropertyGIFHasGlobalColorMap;
    //两帧之间的延时
    const CFStringRef kCGImagePropertyGIFUnclampedDelayTime;
    

    kCGImagePropertyPNGDictionary对应的字典中可能包含的键定义如下:

    //PNG伽马值
    const CFStringRef kCGImagePropertyPNGGamma;
    //混合类型
    const CFStringRef kCGImagePropertyPNGInterlaceType;
    //X方向像素数
    const CFStringRef kCGImagePropertyPNGXPixelsPerMeter;
    //Y方向像素数
    const CFStringRef kCGImagePropertyPNGYPixelsPerMeter;
    //RGB意图
    const CFStringRef kCGImagePropertyPNGsRGBIntent;
    //色度
    const CFStringRef kCGImagePropertyPNGChromaticities;
    //作者
    const CFStringRef kCGImagePropertyPNGAuthor;
    //公司
    const CFStringRef kCGImagePropertyPNGCopyright;
    //创建时间
    const CFStringRef kCGImagePropertyPNGCreationTime;
    //描述
    const CFStringRef kCGImagePropertyPNGDescription;
    //最后修改日期时间
    const CFStringRef kCGImagePropertyPNGModificationTime;
    //软件
    const CFStringRef kCGImagePropertyPNGSoftware;
    //标题
    const CFStringRef kCGImagePropertyPNGTitle;
    //动画循环次数
    const CFStringRef kCGImagePropertyAPNGLoopCount;
    //两帧之间的延时
    const CFStringRef kCGImagePropertyAPNGDelayTime;
    const CFStringRef kCGImagePropertyAPNGUnclampedDelayTime;
    

    kCGImagePropertyGPSDictionary对应的字典中可能包含的键定义如下:

    //GPS版本
    const CFStringRef kCGImagePropertyGPSVersion;
    //纬度是南纬或北纬
    const CFStringRef kCGImagePropertyGPSLatitudeRef;
    //纬度
    const CFStringRef kCGImagePropertyGPSLatitude;
    //经度是东经或西经
    const CFStringRef kCGImagePropertyGPSLongitudeRef;
    //经度
    const CFStringRef kCGImagePropertyGPSLongitude;
    //海拔标准
    const CFStringRef kCGImagePropertyGPSAltitudeRef;
    //海拔高度
    const CFStringRef kCGImagePropertyGPSAltitude;
    //时间戳
    const CFStringRef kCGImagePropertyGPSTimeStamp;
    //测量GPS的卫星
    const CFStringRef kCGImagePropertyGPSSatellites;
    //GPS状态
    const CFStringRef kCGImagePropertyGPSStatus;
    //测量模式
    const CFStringRef kCGImagePropertyGPSMeasureMode;
    //精度数据
    const CFStringRef kCGImagePropertyGPSDOP;
    //速度标准
    const CFStringRef kCGImagePropertyGPSSpeedRef;
    //速度
    const CFStringRef kCGImagePropertyGPSSpeed;
    //运动方向参考
    const CFStringRef kCGImagePropertyGPSTrackRef;
    //运动方向
    const CFStringRef kCGImagePropertyGPSTrack;
    //位置方向参考
    const CFStringRef kCGImagePropertyGPSImgDirectionRef;
    //位置方向
    const CFStringRef kCGImagePropertyGPSImgDirection;
    //地图测量数据
    const CFStringRef kCGImagePropertyGPSMapDatum;
    //地理纬度南纬或北纬
    const CFStringRef kCGImagePropertyGPSDestLatitudeRef;
    //地理纬度
    const CFStringRef kCGImagePropertyGPSDestLatitude;
    //地理经度 东经或西经
    const CFStringRef kCGImagePropertyGPSDestLongitudeRef;
    //地理经度
    const CFStringRef kCGImagePropertyGPSDestLongitude;
    //方位参照
    const CFStringRef kCGImagePropertyGPSDestBearingRef;
    //地理方位
    const CFStringRef kCGImagePropertyGPSDestBearing;
    //距离参照
    const CFStringRef kCGImagePropertyGPSDestDistanceRef;
    //距离
    const CFStringRef kCGImagePropertyGPSDestDistance;
    //查找地理位置的方法
    const CFStringRef kCGImagePropertyGPSProcessingMethod;
    //GPS地区名
    const CFStringRef kCGImagePropertyGPSAreaInformation;
    //日期时间
    const CFStringRef kCGImagePropertyGPSDateStamp;
    //校正信息
    const CFStringRef kCGImagePropertyGPSDifferental;
    //错误信息
    const CFStringRef kCGImagePropertyGPSHPositioningError;
    

    kCGImagePropertyIPTCDictionary对应的字典中可能包含的键定义如下:

    //对象类型
    const CFStringRef kCGImagePropertyIPTCObjectTypeReference;
    //对象属性
    const CFStringRef kCGImagePropertyIPTCObjectAttributeReference;
    //对象名称
    const CFStringRef kCGImagePropertyIPTCObjectName;
    //编辑状态
    const CFStringRef kCGImagePropertyIPTCEditStatus;
    //更新状态
    const CFStringRef kCGImagePropertyIPTCEditorialUpdate;
    //紧急等级
    const CFStringRef kCGImagePropertyIPTCUrgency;
    //主体
    const CFStringRef kCGImagePropertyIPTCSubjectReference;
    //类别
    const CFStringRef kCGImagePropertyIPTCCategory;
    //补充类别
    const CFStringRef kCGImagePropertyIPTCSupplementalCategory;
    //Fixture标识
    const CFStringRef kCGImagePropertyIPTCFixtureIdentifier;
    //关键字
    const CFStringRef kCGImagePropertyIPTCKeywords;
    //内容定位码
    const CFStringRef kCGImagePropertyIPTCContentLocationCode;
    //内容位置名称
    const CFStringRef kCGImagePropertyIPTCContentLocationName;
    //图像使用的最早日期
    const CFStringRef kCGImagePropertyIPTCReleaseDate;
    //图像使用的最早时间
    const CFStringRef kCGImagePropertyIPTCReleaseTime;
    //最后一次使用日期
    const CFStringRef kCGImagePropertyIPTCExpirationDate;
    //最后一次使用时间
    const CFStringRef kCGImagePropertyIPTCExpirationTime;
    //图像使用的特别说明
    const CFStringRef kCGImagePropertyIPTCSpecialInstructions;
    //建议行为
    const CFStringRef kCGImagePropertyIPTCActionAdvised;
    //服务参考
    const CFStringRef kCGImagePropertyIPTCReferenceService;
    //日期参考
    const CFStringRef kCGImagePropertyIPTCReferenceDate;
    //参考码
    const CFStringRef kCGImagePropertyIPTCReferenceNumber;
    //创建日期
    const CFStringRef kCGImagePropertyIPTCDateCreated;
    //创建时间
    const CFStringRef kCGImagePropertyIPTCTimeCreated;
    //数字创建日期
    const CFStringRef kCGImagePropertyIPTCDigitalCreationDate;
    //数字创建时间
    const CFStringRef kCGImagePropertyIPTCDigitalCreationTime;
    //原始程序
    const CFStringRef kCGImagePropertyIPTCOriginatingProgram;
    //程序版本
    const CFStringRef kCGImagePropertyIPTCProgramVersion;
    图像的编辑周期(早晨,晚上或两者)。
    const CFStringRef kCGImagePropertyIPTCObjectCycle;
    //不想创建者名称
    const CFStringRef kCGImagePropertyIPTCByline;
    //图像创建标题
    const CFStringRef kCGImagePropertyIPTCBylineTitle;
    //城市信息
    const CFStringRef kCGImagePropertyIPTCCity;
    //城市内位置
    const CFStringRef kCGImagePropertyIPTCSubLocation;
    //省份
    const CFStringRef kCGImagePropertyIPTCProvinceState;
    //国家编码
    const CFStringRef kCGImagePropertyIPTCCountryPrimaryLocationCode;
    //国家名称
    const CFStringRef kCGImagePropertyIPTCCountryPrimaryLocationName;
    //OriginalTransmission参考
    const CFStringRef kCGImagePropertyIPTCOriginalTransmissionReference;
    //图像内容摘要
    const CFStringRef kCGImagePropertyIPTCHeadline;
    //提供图像服务的名称
    const CFStringRef kCGImagePropertyIPTCCredit;
    //图像源
    const CFStringRef kCGImagePropertyIPTCSource;
    //公司提示
    const CFStringRef kCGImagePropertyIPTCCopyrightNotice;
    //联系人
    const CFStringRef kCGImagePropertyIPTCContact;
    //描述
    const CFStringRef kCGImagePropertyIPTCCaptionAbstract;
    //图像编辑者
    const CFStringRef kCGImagePropertyIPTCWriterEditor;
    //图像类型
    const CFStringRef kCGImagePropertyIPTCImageType;
    //方向信息
    const CFStringRef kCGImagePropertyIPTCImageOrientation;
    //语言信息
    const CFStringRef kCGImagePropertyIPTCLanguageIdentifier;
    //星级
    const CFStringRef kCGImagePropertyIPTCStarRating;
    //联系人详细信息
    const CFStringRef kCGImagePropertyIPTCCreatorContactInfo;
    //图像使用权限
    const CFStringRef kCGImagePropertyIPTCRightsUsageTerms;
    //场景代码
    const CFStringRef kCGImagePropertyIPTCScene;
    

    上面的kCGImagePropertyIPTCCreatorContactInfo对应的字典中键的定义如下:

    //联系人城市
    const CFStringRef kCGImagePropertyIPTCContactInfoCity;
    //联系人国家
    const CFStringRef kCGImagePropertyIPTCContactInfoCountry;
    //联系人地址
    const CFStringRef kCGImagePropertyIPTCContactInfoAddress;
    //邮编
    const CFStringRef kCGImagePropertyIPTCContactInfoPostalCode;
    //省份
    const CFStringRef kCGImagePropertyIPTCContactInfoStateProvince;
    //电子邮件
    const CFStringRef kCGImagePropertyIPTCContactInfoEmails;
    //电话
    const CFStringRef kCGImagePropertyIPTCContactInfoPhones;
    //网址
    const CFStringRef kCGImagePropertyIPTCContactInfoWebURLs;
    

    kCGImageProperty8BIMDictionary对应的字典中可能包含的键定义如下:

    //Photoshop文件的图层名
    const CFStringRef  kCGImageProperty8BIMLayerNames;
    //版本
    const CFStringRef  kCGImageProperty8BIMVersion;
    

    kCGImagePropertyDNGDictionary对应的字典中可能包含的键定义如下:

    //DNG版本
    const CFStringRef  kCGImagePropertyDNGVersion;
    //兼容的最老版本
    const CFStringRef  kCGImagePropertyDNGBackwardVersion;
    //摄像机模型
    const CFStringRef  kCGImagePropertyDNGUniqueCameraModel;
    const CFStringRef  kCGImagePropertyDNGLocalizedCameraModel;
    //相机序列码
    const CFStringRef  kCGImagePropertyDNGCameraSerialNumber;
    //镜头信息
    const CFStringRef  kCGImagePropertyDNGLensInfo;
    //黑度等级
    const CFStringRef  kCGImagePropertyDNGBlackLevel;
    //白度等级
    const CFStringRef  kCGImagePropertyDNGWhiteLevel;
    
    const CFStringRef  kCGImagePropertyDNGCalibrationIlluminant1;
    const CFStringRef  kCGImagePropertyDNGCalibrationIlluminant2;
    const CFStringRef  kCGImagePropertyDNGColorMatrix1;
    const CFStringRef  kCGImagePropertyDNGColorMatrix2;
    const CFStringRef  kCGImagePropertyDNGCameraCalibration1;
    const CFStringRef  kCGImagePropertyDNGCameraCalibration2;
    const CFStringRef  kCGImagePropertyDNGAsShotNeutral;
    const CFStringRef  kCGImagePropertyDNGAsShotWhiteXY;
    const CFStringRef  kCGImagePropertyDNGBaselineExposure;
    const CFStringRef  kCGImagePropertyDNGBaselineNoise;
    const CFStringRef  kCGImagePropertyDNGBaselineSharpness;
    const CFStringRef  kCGImagePropertyDNGPrivateData;
    const CFStringRef  kCGImagePropertyDNGCameraCalibrationSignature;
    const CFStringRef  kCGImagePropertyDNGProfileCalibrationSignature;
    const CFStringRef  kCGImagePropertyDNGNoiseProfile;
    const CFStringRef  kCGImagePropertyDNGWarpRectilinear;
    const CFStringRef  kCGImagePropertyDNGWarpFisheye;
    const CFStringRef  kCGImagePropertyDNGFixVignetteRadial;
    

    kCGImagePropertyCIFFDictionary对应的字典中可能包含的键定义如下:

    //相机信息
    const CFStringRef  kCGImagePropertyCIFFDescription;
    //固件版本
    const CFStringRef  kCGImagePropertyCIFFFirmware;
    //所有者名称
    const CFStringRef  kCGImagePropertyCIFFOwnerName;
    //图片名
    const CFStringRef  kCGImagePropertyCIFFImageName;
    //图片文件名
    const CFStringRef  kCGImagePropertyCIFFImageFileName;
    //曝光方式
    const CFStringRef  kCGImagePropertyCIFFReleaseMethod;
    //曝光时间
    const CFStringRef  kCGImagePropertyCIFFReleaseTiming;
    //RecordID
    const CFStringRef  kCGImagePropertyCIFFRecordID;
    //曝光时间
    const CFStringRef  kCGImagePropertyCIFFSelfTimingTime;
    //相机序列号
    const CFStringRef  kCGImagePropertyCIFFCameraSerialNumber;
    //图片编码
    const CFStringRef  kCGImagePropertyCIFFImageSerialNumber;
    //驱动模式
    const CFStringRef  kCGImagePropertyCIFFContinuousDrive);
    //焦点模式
    const CFStringRef  kCGImagePropertyCIFFFocusMode;
    //测量模式
    const CFStringRef  kCGImagePropertyCIFFMeteringMode;
    //曝光模式
    const CFStringRef  kCGImagePropertyCIFFShootingMode;
    //透镜模式
    const CFStringRef  kCGImagePropertyCIFFLensModel;
    //最长镜头长度
    const CFStringRef  kCGImagePropertyCIFFLensMaxMM;
    //最短镜头长度
    const CFStringRef  kCGImagePropertyCIFFLensMinMM;
    //白平衡等级
    const CFStringRef  kCGImagePropertyCIFFWhiteBalanceIndex;
    //曝光补偿
    const CFStringRef  kCGImagePropertyCIFFFlashExposureComp;
    //实测曝光值
    const CFStringRef  kCGImagePropertyCIFFMeasuredEV);
    

    六、ImageIO框架在实际开发中的几个应用

    1.显示特殊格式的图片

    在平时开发中,我们通常使用UIImage来读取图片,UIImage支持的图片包括png与jpg等,但是类似windows系统的ico图标,UIImage默认是无法显示的,可以通过ImageIO框架来在iOS系统中使用ico图标,示例如下:

    NSString * path = [[NSBundle mainBundle]pathForResource:@"image" ofType:@"ico"];
        NSURL * url = [NSURL fileURLWithPath:path];
        CGImageRef myImage = NULL;
        CGImageSourceRef myImageSource;
        CFDictionaryRef myOptions = NULL;
        myImageSource = CGImageSourceCreateWithURL((CFURLRef)url, NULL);
        myImage = CGImageSourceCreateImageAtIndex(myImageSource,
                                                  0,
                                                  NULL);
        CFRelease(myImageSource);
        UIImageView * image = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 200, 200)];
        image.image = [UIImage imageWithCGImage:myImage];
    

    2.读取数码相机拍摄图片的地理位置、时间等信息

    3.对相册中图片的地理位置,时间等信息进行自定义修改。

    4.将自定义格式的图片数据写入本地文件。

    5.展示GIF动图

    详情见博客:https://my.oschina.net/u/2340880/blog/608560

    6.渐进渲染大图

    渐进渲染技术在对加载大图片时特别重要,你应该使用过地图软件,地图视图在加载时是局部进行加载,当移动或者放大时,地图会一部分一部分的渐进进行加载,使用ImageIO框架可以实现大图渐进渲染的效果,一般在对大图片进行网络请求时,可以获取一部分数据就加载一部分数据,为了便于演示,博客中使用定时器来默认网络返回数据,代码示例如下:

    @interface ViewController ()
    {
        NSMutableData * _data;
        NSData * _allData;
        NSUInteger length;
        UIImageView * _imageView;
        NSTimer * timer;
        NSInteger le;
    }
    @end
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        _data = [[NSMutableData alloc]init];
        NSString * path = [[NSBundle mainBundle]pathForResource:@"Default-Portrait-ns@2x" ofType:@"png"];
        _allData = [NSData dataWithContentsOfFile:path];
        length = _allData.length;
        le = length/10;
        timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateImage) userInfo:nil repeats:YES];
        _imageView = [[UIImageView alloc]initWithFrame:self.view.frame];
        [self.view addSubview:_imageView];
    }
    
    
    -(void)updateImage{
        static int index = 0;
        if (index==10) {
            return;
        }
        NSUInteger l;
        if (index==9) {
            l=length-le*9;
        }else{
            l= le;
        }
        
        Byte by[l];
        [_allData getBytes:by range:NSMakeRange(index*le, l)];
        [_data appendBytes:by length:l];
        CGImageSourceRef myImageSource = CGImageSourceCreateWithData((CFDataRef)_data, NULL);
        CGImageRef myImage = CGImageSourceCreateImageAtIndex(myImageSource,
                                                  0,
                                                  NULL);
        CFRelease(myImageSource);
        
        _imageView.image = [UIImage imageWithCGImage:myImage];
        //    image.image = [UIImage imageNamed:@"image.ico"];
        index++;
    }
    @end
    

    效果如下:

    相关文章

      网友评论

        本文标题:iOS ImageIO框架详解(获取图片Exif信息及修改GPS

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