从UIImage获取RGB数据的快速方法(照片库)

时间:2014-11-04 16:05:35

标签: ios objective-c opengl-es uiimage alasset

我想获得一个数据数组,其中包含存储在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);

1 个答案:

答案 0 :(得分:0)

你没有什么可以做的,但是如果你找到了一种我很乐意听到它的方法。

问题是你需要解压缩图像(jpg,png ...),这通常是通过创建CGImage来完成的(UIImage只是它的包装)。但是你不能直接从CGImage获取数据指针,但是你需要复制它们(真正慢的绘制调用)。尽管如此,如果目标大小和格式与源相同,则此操作应该非常快,因为数据应该或多或少地被复制。另一方面,如果您的textureWidthtextureHeight不同,那么这些像素的图像尺寸需要进行插值,此功能可能会变慢几倍。

我看到的唯一方法是让一些库直接解压缩文件中的图像并获取该图像的数据指针。但是我从未遇到过加载图像纹理的性能问题(使用后台线程)。

无论如何,如果你没有做类似的事情我已经如何使用它来获取图像大小,然后找到填充图像大小的POT(2的幂)宽度和高度。然后我用那些POT尺寸创建一个空纹理并调用子图像将原始图像数据传递给纹理。我使用自定义纹理类来处理它,它还包含(生成)纹理坐标,因此纹理的正确部分被绘制到帧缓冲区。然后这个类被扩展为支持图集,这通常是你在处理许多图像(纹理)时想要做的事情。

我希望这些信息可以帮助您......