Kam*_*tka 6 iphone mmap uiimage
我有一个UIImage,我想将其数据放在一个文件中,然后使用映射文件来节省一些内存.显然,UIImage数据是私有的,无法访问它.你有什么建议可以解决这个问题吗?
谢谢!
如果要对编码图像数据进行内存映射,则mmap文件并通过将CGDataProviderRef传递给CGImageCreate来提供对数据的引用.
mapped = mmap( NULL , length , ... );
provider = CGDataProviderCreateWithData( mapped , mapped , length , munmap_wrapper );
image = CGImageCreate( ... , provider , ... );
uiimage = [UIImage imageWithCGImage:image];
...
Run Code Online (Sandbox Code Playgroud)
munmap_wrapper是这样的:
// conform to CGDataProviderReleaseDataCallback
void munmap_wrapper( void *p , const void *cp , size_t l ) { munmap( p , l ); }
Run Code Online (Sandbox Code Playgroud)
如果你想要内存映射实际像素,而不是编码的源数据,你会做一些与CGBitmapContext类似的事情.您还可以创建提供程序和图像,以便图像引用与上下文相同的像素.无论在上下文中绘制什么,都将是图像的内容.对于上下文和图像,宽度,高度,颜色空间和其他参数应该相同.
context = CGBitmapContextCreate( mapped , ... );
Run Code Online (Sandbox Code Playgroud)
在这种情况下,长度至少为bytes_per_row*height bytes,因此文件必须至少为那么大.
如果您有现有图像并且想要对像素进行mmap,则使用图像的大小和颜色空间创建位图上下文,并使用CGContextDrawImage在上下文中绘制图像.
您没有说出图像的来源,但如果您在运行时创建它,则直接在位图上下文中创建它会更有效.任何图像创建都需要幕后的位图上下文,因此它也可能是从一开始就映射到的内存.
| 归档时间: |
|
| 查看次数: |
1669 次 |
| 最近记录: |