2014-11-04 85 views
1

我想获得一个数据数组,包含存储在iOS(ios8 sdk)上的照片库(ALAsset)中的图片的RGB表示。 我已经尝试过这种方法:从UIImage获取RGB数据的快速方法(照片库)

  • 得到ALAsset的一个CGImage与[ALAssetRepresentation fullScreenImage]
  • 画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); 

回答

0

没有什么可以做,但我如果你找到一种方法,我很高兴听到它。

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

我看到的唯一出路是获得一些库来直接解压缩文件中的图像并获取该图像的数据指针。但我从来没有加载图像纹理的性能问题(使用后台线程)。

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

我希望这个信息以任何方式帮助你...

+0

是的我会用后台线程。但另一个问题是内存。我首先从ALAsset(10mb)获取UIImage,然后复制UIImage以获取RGB数据(10mb)。这可能会引发内存压力问题。 – Nitenq 2014-11-12 12:59:44