2014-11-04 87 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