ios objective-c opengl-es uiimage alasset

ios - método rápido para obtener datos RGB de UIImage(biblioteca de fotos)



objective-c opengl-es (1)

Me gustaría obtener una matriz de datos que contenga la representación RGB de una imagen almacenada en la biblioteca de fotos (un ALAsset) en iOS (ios8 sdk). Ya probé este método:

  • obtener el CGImage de ALAsset con [ALAssetRepresentation fullScreenImage]
  • dibuja CGImage a un CGContext.

Ese método funciona, obtengo un puntero a los datos de rgb, pero esto es realmente lento (hay 2 conversiones). El objetivo final es cargar la imagen rápidamente en una textura OpenGL.

Mi código para obtener una imagen de la biblioteca de fotos

ALAsset* currentPhotoAsset = (ALAsset*) [self.photoAssetList objectAtIndex:_currentPhotoAssetIndex]; ALAssetRepresentation *representation = [currentPhotoAsset defaultRepresentation]; //-> REALLY SLOW UIImage *currentPhoto = [UIImage imageWithCGImage:[representation fullScreenImage]];

Mi código para dibujar en 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);


No hay mucho que puedas hacer, pero si encuentras una manera en la que me gustaría saberlo.

Lo que pasa es que necesitas descomprimir la imagen (jpg, png ...) que normalmente se hace creando una CGImage ( UIImage es solo una envoltura alrededor de ella). Pero luego no se le permite obtener el puntero de datos directamente desde CGImage pero debe copiarlos (la llamada de dibujo realmente lenta). Aunque, de nuevo, si el tamaño y el formato del objetivo son los mismos que los de la fuente, esta operación debería ser bastante rápida, ya que los datos deberían copiarse más o menos de forma simple. Por otro lado, si textureWidth y textureHeight son diferentes, entonces las dimensiones de la imagen deben ser interpoladas y esta función puede volverse incluso un poco más lenta.

La única forma de salir de esto que veo es conseguir que una biblioteca descomprima directamente la imagen del archivo y obtenga el puntero de datos de esa imagen. Pero nunca tuve un problema de rendimiento para cargar texturas de imagen (use un hilo de fondo).

De todos modos, si no estás haciendo algo similar, como uso esto es para obtener el tamaño de la imagen, entonces encuentra el POT (poder de dos) ancho y alto que llena el tamaño de la imagen. Luego creo una textura vacía con esas dimensiones POT y llamo a una imagen secundaria para pasar los datos de la imagen original a la textura. Utilizo una clase de textura personalizada para manejar esto que también contiene (genera) coordenadas de textura para que la parte correcta de la textura se dibuje en el búfer de cuadros. Luego, esta clase se amplía para admitir atlasing, que generalmente es lo que desea hacer cuando se trata de muchas imágenes (texturas).

Espero que esta información te ayude de cualquier manera ...