2014-11-04 8 views
1

ios (ios8 SDK)의 사진 라이브러리 (ALAsset)에 저장된 그림의 RGB 표현을 포함하는 데이터 배열을 가져오고 싶습니다.UIImage (사진 라이브러리)에서 RGB 데이터를 가져 오는 빠른 방법

  • 가 CGContext로의 CGImage 그릴 [ALAssetRepresentation fullScreenImage]와 ALAsset에서 ㄱ의 CGImage 얻을 : 은 이미이 방법을 시도했다. 방법은 작동

, 내가 데이터를 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

당신이 할 수 있지만, 난 당신이 방법을 찾을 경우를 I 그것에 대해 듣게되어 기쁠 것입니다.

일반적으로 CGImage (UIImage)을 생성하여 이미지 (jpg, png ...)를 압축 해제해야합니다. 그런데 CGImage에서 직접 데이터 포인터를 가져올 수는 없지만 복사해야합니다 (실제로 느린 그리기 호출). 목표 크기와 형식이 소스와 동일하면 데이터가 다소 단순하게 복사되어야하기 때문에이 작업은 매우 빠르다. 반면에 textureWidthtextureHeight이 다른 경우 이미지 크기가 보간 될 필요가 있으며이 기능은 몇 배 느려질 수 있습니다.

유일한 방법은 파일을 직접 압축 해제하고 해당 이미지의 데이터 포인터를 가져 오는 라이브러리를 얻는 것입니다. 하지만 이미지 텍스처를로드하는 데 성능 문제가 없었습니다 (백그라운드 스레드 사용).

어쨌든 내가 비슷한 것을 사용하지 않는다면 이미지 크기를 얻는 것이고 그 다음 이미지 크기를 채우는 POT (2의 거듭 너비) 너비와 높이를 찾으십시오. 그런 다음 POT 치수로 빈 텍스처를 만들고 원본 이미지 데이터를 텍스처로 전달하기 위해 하위 이미지를 호출합니다. 나는 커스텀 텍스쳐 클래스를 사용하여 이것을 처리한다.이 텍스쳐 좌표는 텍스쳐 좌표를 포함하고있어서 텍스처의 정확한 부분이 프레임 버퍼에 그려진다. 그런 다음이 클래스는 많은 이미지 (텍스처)를 다룰 때 일반적으로 수행하려는 아트 레이싱을 지원하도록 확장됩니다.

이 정보가 어떤 식 으로든 도움이되기를 바랍니다.

+0

예 백그라운드 스레드를 사용합니다. 그러나 다른 문제는 기억이다. 먼저 ALAsset (10MB)에서 UIImage를 얻은 다음 UIImage를 복사하여 RGB 데이터 (10MB)를 얻습니다. 그것은 메모리 부족 문제를 유발할 수 있습니다. – Nitenq