从UIImage(照片库)获取RGB数据的快速方法
我想获得一个数据数组,其中包含存储在iOS(ios8 sdk)上的照片库(ALAsset)中的图片的RGB表示。 我已经试过这个方法:
- 使用[ALAssetRepresentation fullScreenImage]从ALAsset获取CGImage
- 将CGImage绘制到CGContext。
该方法的工作原理,我得到一个指向rgb数据,但这是非常缓慢 (有2个转换)。 最终目标是在OpenGL纹理中快速加载图像。
我的代码来从照片库中获取图像
ALAsset* currentPhotoAsset = (ALAsset*) [self.photoAssetList objectAtIndex:_currentPhotoAssetIndex]; ALAssetRepresentation *representation = [currentPhotoAsset defaultRepresentation]; //-> REALLY SLOW UIImage *currentPhoto = [UIImage imageWithCGImage:[representation fullScreenImage]];
我的代码在CGContext上绘制:
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); NSUInteger bytesPerPixel = 4; NSUInteger bytesPerRow = bytesPerPixel * textureWidth; NSUInteger bitsPerComponent = 8; CGContextRef context = CGBitmapContextCreate(textureData, textureWidth, textureHeight, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGColorSpaceRelease(colorSpace); //--> THAT'S REALLY SLOW CGContextDrawImage(context, CGRectMake(0, 0, textureWidth, textureHeight), cgimage); CGContextRelease(context);
没有太多的事情可以做,但如果你find一种方法,我会很乐意听到这件事。
问题是你需要解压缩图像(jpg,png …),这通常是通过创build一个CGImage
( UIImage
只是一个包装器)来完成的。 但是,你不能直接从CGImage
获取数据指针,但是你需要复制它们(真正慢的绘制调用)。 尽pipe如此,如果目标大小和格式与源相同,则该操作应该相当快,因为数据应该或多或less地被简单地复制。 另一方面,如果你的textureWidth
和textureHeight
不同,那么这些像素需要插值的图像尺寸,这个函数可能会慢几倍。
我看到的唯一出路是获得一些库直接解压文件中的图像,并获取该图像的数据指针。 但是我从来没有加载图像纹理的性能问题(使用后台线程)。
无论如何,如果你没有做类似的事情,我已经使用这种方式来获取图像大小,然后find填充图像大小的POT(两个幂次)宽度和高度。 然后,我用这些POT尺寸创build一个空的纹理,并调用子图像将原始图像数据传递给纹理。 我使用一个自定义的纹理类来处理这个也包含(生成)纹理坐标的纹理,因此纹理的正确部分被绘制到帧缓冲区。 然后这个类被扩展来支持image processing,这通常是你在处理很多图像(纹理)时要做的事情。
我希望这个信息以任何方式帮助你…