Image I/O编程指南

底层图像处理之GIF图片的合成与解析(三) 阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 GIF的应用场景 GIF在iOS中的使用场景有以下三个方面。 (1)GIF图片分解为单帧图片。 (2)一系列单帧图片合成GIF图片。 (3)iOS系统上展示GIF动画效果。 在GIF的合成和分解方面将会接触到iOS图像处理核心框架ImageIO,作... 阅读详情
一、基本的Image I/O使用
Image I/O框架提供了不透明数据类型来读取图像数据和写图像数据到一个目的地(CGImageSourceRef和CGImageDestinationRef)。它支持很多图像格式,包括标准web格式、搞动态范围图像,和原始相机数据。Image I/O还有许多其他特性:
1)mac平台上的最快的图像解码和编码。
2)逐步加载图片的能力。
3)支持图像元数据。
4)缓存效果。
你可以通过下面的对象来创建image source和image destination:
1)URLs:即CFURLRef对象。
2)Core Foundation对象:CFDataRef和CFmutableDataRef。
3)Quartz data consumer(CGDataConsumerRef)和data provider(CGDataProviderRef)对象。

1、使用Image I/O框架:  #import <ImageIO/ImageIO.h>
2、支持的图像格式:例如JPEG、JPEG2000、RAW、TIFF、BMP、PNG。在不同的平台不是所有的格式都支持。你可以调用下列函数来获得支持的格式:
1)CGImageSourceCopyTypeIdentifiers:返回同一类型修饰符的数组,表示支持的图像源。
2)CGImageDestinationCopyTypeIdentifiers:返回支持的目的地的Uniform Type Identifiers(UTIs)。

你可以使用CFShow函数来打印结果。
CFArrayRef mySourceTypes = CGImageSourceCopyTypeIdentifiers();
CFShow(mySourceTypes);
CFArrayRef myDestinationTypes = CGImageDestinationCopyTypeIdentifiers();
CFShow(myDestinationTypes);
一般格式是com.apple.pict,public.jpeg,public.tiff等。

二、创建和使用Image Sources
1、从一个Image Source创建一个Image:
下面的例子显示了如何从一个路径中创建一个image source然后提取出image。当你创建一个image source时,你可以提供一个提示作为image source file的格式。
当你从image source中创建image时,你必须指定一个index,并且可以提供一个属性字典来指定一些事情,如是否创建一个缩略图或是否允许缓存。CGImageSource Reference和CGImageProperties Reference提供了键和期待的数据类型的列表。
你需要提供一个index值,因为一些image file 格式允许多个image存在于一个source file中。对于只有一个image的image source,传递0就可以了。你可以通过函数CGImageSourceGetCount来获得image source file中包含的image的数量。
例子:
CGImageRef MyCreateCGImageFromFile (NSString* path)
{
    // Get the URL for the pathname passed to the function.
    NSURL *url = [NSURL fileURLWithPath:path];
    CGImageRef        myImage = NULL;
    CGImageSourceRef  myImageSource;
    CFDictionaryRef   myOptions = NULL;
    CFStringRef       myKeys[2];
    CFTypeRef         myValues[2];

    // Set up options if you want them. The options here are for
    // caching the image in a decoded form and for using floating-point
    // values if the image format supports them.
    myKeys[0] = kCGImageSourceShouldCache;
    myValues[0] = (CFTypeRef)kCFBooleanTrue;
    myKeys[1] = kCGImageSourceShouldAllowFloat;
    myValues[1] = (CFTypeRef)kCFBooleanTrue;
    // Create the dictionary
    myOptions = CFDictionaryCreate(NULL, (const void **) myKeys,
                   (const void **) myValues, 2,
                   &kCFTypeDictionaryKeyCallBacks,
                   & kCFTypeDictionaryValueCallBacks);
    // Create an image source from the URL.
    myImageSource = CGImageSourceCreateWithURL((CFURLRef)url, myOptions);
    CFRelease(myOptions);
    // Make sure the image source exists before continuing
    if (myImageSource == NULL){
        fprintf(stderr, "Image source is NULL.");
        return  NULL;
    }
    // Create an image from the first item in the image source.
    myImage = CGImageSourceCreateImageAtIndex(myImageSource,
                                           0,
                                           NULL);
 
    CFRelease(myImageSource);
    // Make sure the image exists before continuing
    if (myImage == NULL){
         fprintf(stderr, "Image not created from image source.");
         return NULL;
    }
 
    return myImage;
}

2、从一个Image Source中创建一个缩略图
一些image source file包含缩略图。如果缩略图没有准备好,Image I/O给你一些选项来创建他们。你还可以指定一个最大的缩略图尺寸和是否应用一个transform到缩略图上。
例子:
CGImageRef MyCreateThumbnailImageFromData (NSData * data, int imageSize)
{
    CGImageRef        myThumbnailImage = NULL;
    CGImageSourceRef  myImageSource;
    CFDictionaryRef   myOptions = NULL;
    CFStringRef       myKeys[3];
    CFTypeRef         myValues[3];
    CFNumberRef       thumbnailSize;
 
   // Create an image source from NSData; no options.
   myImageSource = CGImageSourceCreateWithData((CFDataRef)data,
                                               NULL);
   // Make sure the image source exists before continuing.
   if (myImageSource == NULL){
        fprintf(stderr, "Image source is NULL.");
        return  NULL;
   }
 
   // Package the integer as a  CFNumber object. Using CFTypes allows you
   // to more easily create the options dictionary later.
   thumbnailSize = CFNumberCreate(NULL, kCFNumberIntType, &imageSize);
 
   // Set up the thumbnail options.
   myKeys[0] = kCGImageSourceCreateThumbnailWithTransform;
   myValues[0] = (CFTypeRef)kCFBooleanTrue;
   myKeys[1] = kCGImageSourceCreateThumbnailFromImageIfAbsent;
   myValues[1] = (CFTypeRef)kCFBooleanTrue;
   myKeys[2] = kCGImageSourceThumbnailMaxPixelSize;
   myValues[2] = (CFTypeRef)thumbnailSize;
 
   myOptions = CFDictionaryCreate(NULL, (const void **) myKeys,
                   (const void **) myValues, 2,
                   &kCFTypeDictionaryKeyCallBacks,
                   & kCFTypeDictionaryValueCallBacks);
 
  // Create the thumbnail image using the specified options.
  myThumbnailImage = CGImageSourceCreateThumbnailAtIndex(myImageSource,
                                          0,
                                          myOptions);
  // Release the options dictionary and the image source
  // when you no longer need them.
  CFRelease(thumbnailSize);
  CFRelease(myOptions);
  CFRelease(myImageSource);
 
   // Make sure the thumbnail image exists before continuing.
   if (myThumbnailImage == NULL){
         fprintf(stderr, "Thumbnail image not created from image source.");
         return NULL;
   }
 
   return myThumbnailImage;
}

3、逐步地加载一幅图像:
如果你有一个很大的图像,或者正在从网络上加载图像数据,你或许就想创建一个incremental image source,然后你就可以一点点地加载图像数据。你需要执行下面的步骤:
1)创建一个CFData对象来累积图像数据。
2)创建一个incremental image source,通过调用函数CGImageSourceCreateIncremental。
3)添加image data到CFData对象。
4)调用函数CGImageSourceUpdateData,传递CFData对象和一个布尔值(bool数据类型)来指定是否data 参数包含了整个图像,或只是图像数据的一部分。在任意一种情况下,data参数都必须包含当前所有的图像数据。
5)如果你已经累积了足够的图像数据,就通过函数CGImageSourceCreateImageAtIndex,来绘制部分图像,然后release掉。
6)检查你是否已经有了所有的数据,通过函数CGImageSourceGetStatusAtIndex。如果图像完成了,函数返回kCGImageStatusComplete。如果没有完成,就重复3-4步,直到其完成。
7)释放incremental image source。

4、显示图像属性:
包括image dimensions(大小)、resolution(分辨率)、orientation(方向)、color profile、aperture、metering mode,focal length、creation date、keywords、caption等等。
虽然函数CGImageSourceCopyPropertiesAtIndex可以检索所有图像相关的属性的字典,你还是需要写代码来检索这个字典并显示信息。
在mac中,你可以。。。

三、使用Image Destinations:
在你创建了一个CGImageDestination对象之后,你可以添加image数据和设置image属性,然后调用函数CGImageDestinationFinalize来结束。
1、设置Image Destination的属性:
函数CGImageDestinationSetProperties添加一个属性字典CFDictionaryRef到image destination的图像中。虽然设置属性是可选的,但是很多时候你都需要这么做。例如,如果你的应用允许用户添加keywords到图像或更改saturation(色饱和度)、exposure(曝光值)等等。

2、将图像写入到一个Image Destination:
CGImageDestinationCreateWithURL、CGImageDestinationCreateWithData、CGImageDestinationCreateWithDataConsumer函数。
创建完之后,你可以添加image,通过调用CGImageDestinationAddImage或CGImageDestinationAddImageFromSource函数。
最后调用CGImageDestinationFinalize来结束。一旦结束,你就不能再添加更多的数据到image destination。
例子:
- (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);
}
Python 异步编程实战:用 asyncio 高效执行 I/O 密集型任务 本文深入探讨Python的异步编程框架asyncio,重点解析其在高并发I/O密集型任务中的应用优势。文章首先对比同步与异步编程模式,解释事件循环机制;然后通过具体代码示例展示如何使用async/await语法实现异步网络请求,相比同步方式显著提升性能(10次请求从10秒缩短至1-2秒)。同时介绍了并发控制技巧(gather、wait、Semaphore)和图片下载等实战案例,并总结适用场景(网络/文件/数据库操作)与注意事项(不适合CPU密集型任务)。最后推荐相关异步库和参考资料,为开发者提供完整的异步编 阅读详情

相关推荐

虚拟机的“冷启动”优化:C#如何减少I/O延迟?

本文探讨了在C#中优化虚拟机"冷启动"和减少I/O延迟的实用策略。主要方法包括:精简虚拟机镜像并使用SSD存储、预加载关键数据到内存缓存、通过异步I/O操作减少阻塞、利用高效序列化库优化数据读写、采用轻量级虚拟化技术如Firecracker微虚拟机,以及启用gRPC和网络压缩提升通信效率。文章还推荐使用性能分析工具监控优化效果,并提供了具体的代码示例和系统配置建议。这些策略综合运用可显著提升虚拟机启动速度和应用响应性能。

java专栏 1077






浅谈移动端图片压缩(iOS & Android)

在 App 中,如果分享、发布、上传功能涉及到图片,必不可少会对图片进行一定程度的压缩。笔者最近在公司项目中恰好重构了双端(iOS&amp;Android)的图片压缩模块。本文会非常基础的讲解一些图片压缩的方式和思路。 图片格式基础 点阵图&amp;矢量图 点阵图:也叫位图。用像素为单位,像素保存颜色信息,排列像素实现显示。 矢量图:记录元素形状和颜色的算法,显示时展示算法运算的结果。 颜色 ...

weixin_33743248的博客 910

imageio源码深度学习

imageio-2.2.0.tar.gz 解压后安装。./configure ,阅读readme。

iOS gif制作

1、创建图像目标 [objc] view plain copy CGImageDestinationRef destination;   2、创建输出路径(保存的路径) [objc] view plain copy /*       path  */  

Ven519的博客 878

高速PCB设计中串扰的成因、影响与实战控制策略

在高速数字电路与硬件系统设计中,信号完整性是确保系统稳定可靠的核心基础。其核心原理在于,当信号在传输线上传播时,会伴随产生电场与磁场,若相邻导线距离过近,便会通过电磁场耦合产生不期望的能量转移,即串扰。这一现象会直接导致信号波形畸变、时序偏移和噪声裕量降低,严重影响系统性能。从技术价值看,深入理解并有效控制串扰,是提升数据传输速率、保障系统稳定性和降低误码率的关键。其应用场景广泛覆盖了从高速SerDes链路、DDR内存接口到高精度模拟电路等几乎所有现代电子系统。本文聚焦于高速PCB设计中的串扰问题,系统剖析

weixin_27625589的博客 574

Nvidia Jetson AGX Orin 如何进入 Recovery Mode(刷机注意事项)

Jetson Orin 如何进入Recovery mode + 刷机注意事项

Pandako's Blog 1万+

iOS CFObject和NSObject的相互转换(使用bridge)

在Core Foundation框架和Foundation框架中有大量的可互换使用的数据类型。这意味着你可以使用相同的数据类型,作为Core Foundation框架方法调用或Objective-C消息的参数或接收者。这种在Core Foundation框架和Foundation框架之间交换使用数据类型的技术就叫 Toll-Free Bridging。         由于ARC环境下编译器不会

司马懿的西山居 5853

BlenderGis安装碰到问题,ImageIO、无法点击和地图不加载

BlenderGis安装碰到问题,ImageIO、无法点击和地图不加载问题

qq_45176349的博客 4963

CGImageDestination Reference

CGImageDestination用于将照片写入到用户的磁盘中,在写入前可修改元数据。

路漫漫其修远兮,吾将上下而求索! 3046

数据采集卡架构与PCIe优化设计详解

数据采集卡(DAQ)作为工业自动化中的关键设备,其核心在于模数转换(ADC)和数字信号处理技术。现代系统普遍采用PCIe总线架构,通过DMA传输和时钟同步技术实现高速数据采集。在信号调理环节,可编程增益放大器(PGA)和抗混叠滤波器确保信号质量;而Σ-Δ型ADC则提供高达24位的分辨率。实际应用中,从电力监测到机床振动分析,数据采集卡需要结合具体场景优化配置。通过合理的PCB布局和EMI防护设计,可以有效提升系统在工业环境中的可靠性。

weixin_29168675的博客 909

为什么Nano Banana在图像一致性上碾压GPT和豆包?深度解析其技术原理与使用技巧

本文深度解析了Nano Banana在图像一致性上超越GPT和豆包等工具的技术原理。它通过基于参考图的强条件生成、精准的区域感知与掩码控制等核心技术,实现了“外科手术式”的精准图像编辑。文章还分享了包括提示词工程、参数调整在内的实用技巧,并探讨了通过API Key将其能力集成到自动化工作流中的潜力。

omega的博客 354

IOS Image I/O编程指南

http://supershll.blog.163.com/blog/static/37070436201298111139748/ Image I/O编程指南 一、基本的Image I/O使用 Image I/O框架提供了不透明数据类型来读取图像数据和写图像数据到一个目的地(CGImageSourceRef和CGImageDestinationRef)。它支持很多图像格式,包括

mituan1234567的专栏 947

YOLO26涨点改进 | 全网独家,注意力创新改进篇 | Arxiv2025 | YOLO26引入MSLA多尺度线性注意力模块,高效提取多尺度特征和建模长程依赖,含多种创新改进,助力有效涨点

本文提出了一种多尺度线性注意力模块(MSLA)来优化YOLO26模型。MSLA通过并行使用不同尺寸的深度可分离卷积(3×3至9×9)提取多尺度特征,并结合线性注意力机制高效建模全局依赖关系。该模块显著提升了模型对多尺度目标的检测能力,同时保持了轻量化特性。实验表明,MSLA能有效增强小目标检测和复杂场景下的分割精度。文章详细介绍了MSLA的网络结构、核心优势及实现代码,并提供了两种集成MSLA的YOLO26改进方案,为实时目标检测任务提供了高效解决方案。

Ai缝合怪、助力小伙伴高效发论文 291

ImageIO.framework

Image I/O Programming Guide https://developer.apple.com/library/ios/documentation/graphicsimaging/Conceptual/ImageIOGuide/imageio_intro/ikpg_intro.html#//apple_ref/doc/uid/TP40005462 CGImageSo

chengyakun11的专栏 3780

【AI Guide】AI面试攻略只用看这一篇就够了!力争做全网最全的AI面试攻略——大模型(五)Adapter 微调

Adapter 微调(Adapter Fine-tuning)是一种高效的参数高效微调(PEFT)方法。相较于全参数微调(Full Fine-tuning),Adapter 在预训练模型的特定层插入轻量级的可训练模块,而冻结原始模型参数,从而减少计算和存储开销。是缩放因子,控制 Adapter 输出的影响程度。设 Transformer 层的隐藏状态为。为 Adapter 层的可训练参数,为非线性激活函数,如 ReLU。为冻结的预训练模型参数,

AI科研社 182

CarSim仿真高级进阶---VS 命令行

仿真软件作为一种强大的工具,被广泛应用于汽车工程领域,本文将介绍如何使用VS命令行进行CarSim仿真的高级进阶操作,我们将结合相关的源代码和描述,帮助读者更好地理解和应用这一功能。打开Visual Studio,在“文件”菜单下选择“新建”->“项目”,然后选择“控制台应用程序”模板,填写项目名称和位置,点击“确定”按钮创建项目。保存源代码后,点击菜单中的“生成”->“生成解决方案”来构建项目,确保构建成功,没有任何错误。点击“编辑”按钮,在弹出的窗口中点击“新建”按钮。,并拥有有效的许可证。

weixin_50547796的博客 308

Image I/O 编程指引

Image I/O 框架提供了从CGImageSourceRef读取图片数据和写入图片数据到CGImageDestinationRef的不透明数据类型。可以支持多种图片格式,包括标准的web格式,高动态范围图片和原始的相机数据。

king2716的专栏 1804

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

SwiftUI Image I/O 基础教程

Image I/O 读取和写入大多数图像文件格式。 管理颜色并访问图像元数据。 使用教程 映像I / O编程接口框架允许应用程序读取和写入大多数映像文件格式。 该框架提供了高效率,色彩管理以及对图像元数据的访问。 推荐 基础文章推荐 《SwiftUI是什么,听听大牛们如何说》 经典教程推荐 更新近百篇SwiftUI教程《SwiftUI2020教程》 帮您突破数据存储难关《SwiftUI v...

iCloudEnd的博客 377

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Apple - Image I/O Programming Guide

一、介绍 1、谁应该阅读本文档? 2、本文档的组织 3、也可以看看 二、使用Image I/O 的基础知识 1、在应用程序中使用Image I/O 框架 2、支持的图像格式 三、创建和使用图像源 1、从图像源创建图像 2、从图像源创建缩略图 3、逐步加载图像 4、显示图像属性 四、使用图像目标 1、设置图像目标的属性 2、将图像写入图像目标 3、创建动画图像

AI工程化、开源分享、文档翻译、代码笔记 1400

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java编程基础之I/O

我们为什么要学习Java I/O?在对象序列化、Json解析、XML解析、zip压缩处理的时候,均需要以I/O作为基础,这些都需要很扎实的Java基础。 Java I/O 概要设计 我们在I/O中经常能看见这样的使用方式: DataOutputStream out =new DataOutputStream( new BufferedOutputStream( new FileOutputStream( new File(f

暮暮频顾惜的博客 205

Java核心技术之I/O

Java I/O

WananRd 152

Java I/O 流:从字节流到 NIO 的进化与应用

在 Java 编程中,输入输出(I/O)操作是与外部世界交互的重要桥梁,无论是读取文件、网络通信还是处理用户输入,都离不开 I/O 流的身影。从最初的字节流、字符流,到后来的 NIO(New I/O),Java 的 I/O 体系不断进化,为开发者提供了更高效、更灵活的操作方式。本文将带你深入了解 Java I/O 流的世界,从基础的流体系划分,到常见的操作陷阱,再到 NIO 的入门知识,全方位掌握 I/O 流的进化与应用。

Java是世界上最好的语言 1227
上一篇: 如何用Xcode 4.5 编译支持 armv6 CPU及iOS 4.3以前的版本
下一篇: Objective-C概述
focusjava
博客等级 码龄14年 127粉丝 528原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值