ImageIO框架详细解析(四) —— 图像目的地相关

版本记录

版本号 时间
V1.0 2017.10.17

前言

ImageIO框架主要用来读写大多数图像文件格式。 管理颜色和访问图像元数据。接下来几篇我们就详细的解析这个框架。感兴趣的可以看我写的上面几篇。
1. ImageIO框架详细解析(一) —— 基本概览
2. ImageIO框架详细解析(二) —— 使用ImageIO基础
3. ImageIO框架详细解析(三) —— 创建和使用图像源

Working with Image Destinations - Image Destinations使用

图像目的地抽象了数据写任务,消除了通过原始缓冲区管理数据的需要。图像目的地可以表示单个图像或多个图像。它可以包含缩略图和每个图像的属性。在为适当的目标(URL、CFData对象或Quartz数据消费者)创建一个CGImageDestination对象后,您可以添加图像数据和设置图像属性。当你完成添加数据时,调用函数CGImageDestinationFinalize


Setting the Properties of an Image Destination - 设置图像目的地的属性

函数CGImageDestinationSetProperties将属性(键值对)的字典(CFDictionaryRef)添加到图像目标中的图像。虽然设置属性是可选的,但您可能需要设置许多情况。例如,如果您的应用程序允许用户向图像添加关键字或更改饱和度,曝光或其他值,则需要将该信息保存在选项字典中。

Image I / O定义了一组广泛的键来指定压缩质量,背景合成颜色,Exif字典键,颜色模型值,GIF字典键,尼康和佳能相机键等等。请参阅CGImageProperties Reference参考。

设置字典时,您有两种选择。您可以创建一个CFDictionary对象,或者您可以创建一个NSDictionary对象,然后将其转换为CFDictionaryRef,当您将可选字典传递给函数CGImageDestinationSetProperties。 (CFDictionaryNSDictionary是可互换的,或自由桥接的。)。Listing 3-1显示了一个代码片段,为三个属性分配键值对,然后创建一个包含这些属性的字典。因为这是一个代码片段,所以释放代码创建的CFNumberCFDictionary对象的必须调用的没有展示出来。编写代码时,当您不再需要这些对象时,您需要调用CFRelease

为属性设置键值对时,您需要参考参考文档(请参阅CGImageDestination ReferenceCGImageProperties Reference参考)以获取该值的预期数据类型。如Listing 3-1所示,数值通常需要包装在CFNumber对象中。当您使用Core Foundation类型作为字典值类型时,您还可以在创建字典时提供回调常数-kCFTypeDictionaryKeyCallBacks
kCFTypeDictionaryValueCallBacks。 (见CFDictionary Reference。)

// **Listing 3-1**  Setting the properties of an image destination

float compression = 1.0; // Lossless compression if available.

int orientation = 4; // Origin is at bottom, left.

CFStringRef myKeys[3];

CFTypeRef myValues[3];

CFDictionaryRef myOptions = NULL;

myKeys[0] = kCGImagePropertyOrientation;

myValues[0] = CFNumberCreate(NULL, kCFNumberIntType, &orientation);

myKeys[1] = kCGImagePropertyHasAlpha;

myValues[1] = kCFBooleanTrue;

myKeys[2] = kCGImageDestinationLossyCompressionQuality;

myValues[2] = CFNumberCreate(NULL, kCFNumberFloatType, &compression);

myOptions = CFDictionaryCreate( NULL, (const void **)myKeys, (const void **)myValues, 3,

&kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);

// Release the CFNumber and CFDictionary objects when you no longer need them.

Writing an Image to an Image Destination - 将图像写入图像目的地

要将图像写入目的地,首先需要通过调用 CGImageDestinationCreateWithURLCGImageDestinationCreateWithDataCGImageDestinationCreateWithDataConsumer函数创建一个图像目标对象。您需要提供生成的图像文件的UTI。您可以提供UTI或等效常数(如果有的话),见Table 1-1

创建图像目的地后,可以通过调用CGImageDestinationAddImage
或者 CGImageDestinationAddImageFromSource函数来添加图像。如果图像目的地文件的格式支持多个图像,则可以反复添加图像。Image I / O完成添加图像,调用函数CGImageDestinationFinalize。一旦完成,您不能再添加任何更多的数据到图像目的地。

Listing 3-2显示了如何实现一种写入图像文件的方法。虽然此列表显示了如何使用Objective-C方法中的图像目标,但您可以轻松地在过程C函数中创建和使用图像目标。 可选参数包括您要为图像指定的任何属性,如相机或压缩设置。

// **Listing 3-2**   A method that writes an image to a URL

- (void) writeCGImage: (CGImageRef) image toURL: (NSURL*) url withType: (CFStringRef) imageType andOptions: (CFDictionaryRef) options

{

CGImageDestinationRef myImageDest = CGImageDestinationCreateWithURL((CFURLRef)url, imageType, 1, nil);

CGImageDestinationAddImage(myImageDest, image, options);

CGImageDestinationFinalize(myImageDest);

CFRelease(myImageDest);

}

Creating an Animated Image - 创建一个动画图像

Image I / O也可用于创建动画图像。 创建动画图像时,您可以为要添加到图像的每个帧调用CGImageDestinationAddImage。 您还必须指定控制动画执行方式的其他属性。

Listing 3-3显示了如何创建动画PNG图像。 首先,它创建一对字典来保存动画属性。 第一个字典指定动画PNG在停止在最后一帧之前重复其动画的次数。 第二个字典指定序列中每个帧使用的帧延迟。 创建图像目标后,代码设置目标图像的文件属性,然后一次添加一个帧。 最后,调用CGImageDestinationFinalize方法来完成动画PNG。

// Listing 3-3  Creating an animated PNG file

let loopCount = 1
let frameCount = 60
 
var fileProperties = NSMutableDictionary()
fileProperties.setObject(kCGImagePropertyPNGDictionary, forKey: NSDictionary(dictionary: [kCGImagePropertyAPNGLoopCount: frameCount]))
 
var frameProperties = NSMutableDictionary()
frameProperties.setObject(kCGImagePropertyPNGDictionary, forKey: NSDictionary(dictionary: [kCGImagePropertyAPNGDelayTime: 1.0 / Double(frameCount)]))
 
guard let destination = CGImageDestinationCreateWithURL(fileURL, kUTTypePNG, frameCount, nil) else {
    // Provide error handling here.
}
 
CGImageDestinationSetProperties(destination, fileProperties.copy() as? NSDictionary)
 
for i in 0..<frameCount {
    autoreleasepool {
        let radians = M_PI * 2.0 * Double(i) / Double(frameCount)
        guard let image = imageForFrame(size: CGSize(width: 300, height: 300)) else {
            return
        }
        
        CGImageDestinationAddImage(destination, image, frameProperties)
    }
}
 
if !CGImageDestinationFinalize(destination) {
    // Provide error handling here.
}

后记

未完,待续~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容