iphone - 内存映射 UIImage

标签 iphone uiimage mmap

我有一个UIImage,我想将其数据放入一个文件中,然后使用映射文件来节省一些内存。显然,UIImage 数据是私有(private)的,无法访问它。您有什么建议来解决这个问题吗?

谢谢!

最佳答案

如果您想要内存映射编码的图像数据,则映射一个文件并通过将 CGDataProviderRef 传递给 CGImageCreate 来提供对数据的引用。

mapped = mmap( NULL , length , ... );
provider = CGDataProviderCreateWithData( mapped , mapped , length , munmap_wrapper );
image = CGImageCreate( ... , provider , ... );
uiimage = [UIImage imageWithCGImage:image];
...

munmap_wrapper 是这样的:

// conform to CGDataProviderReleaseDataCallback
void munmap_wrapper( void *p , const void *cp , size_t l ) { munmap( p , l ); }

如果您想要内存映射实际像素,而不是编码的源数据,您可以使用 CGBitmapContext 执行类似的操作。您还可以创建提供程序和图像,以便图像引用与上下文相同的像素。上下文中绘制的任何内容都将是图像的内容。上下文和图像的宽度、高度、颜色空间和其他参数应该相同。

context = CGBitmapContextCreate( mapped , ... );

在这种情况下,长度至少为 bytes_per_row*height 字节,因此文件必须至少有那么大。

如果您有现有图像并且想要映射像素,请使用图像的大小和颜色空间创建位图上下文,并使用 CGContextDrawImage 在上下文中绘制图像。

您没有说明图像的来源,但如果您在运行时创建它,那么直接在位图上下文中创建它会更有效。任何图像创建都需要在幕后有一个位图上下文,因此它也可能从一开始就是内存映射的。

关于iphone - 内存映射 UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3274244/

相关文章:

iphone - 如何使用 Cocoa (iPhone) 解码 XML 文档中的 shift-jis 编码数据

iphone - 如何在SMS应用程序中查看从iPhone中的应用程序内部发送的消息?

ios - 找到可用的网格位置

ios - TabBar 项目图像大小

ios - 通过 UIImage 或 PHImageManager 调整图像大小

ios - Swift 4:无法将“数据”类型的值转换为预期的参数类型“数据”

c++ - 使用 mmap 时出现段错误

iphone - 如何使用 NSURLResponse 作为 segue 触发器 swift

linux - mmap 可以与 SPI 设备一起使用吗?

c - mmap 替代 malloc