2012-02-13 8 views
7

estoy usando ALAsset para recuperar imágenes como que:Cómo guardar la imagen de ALAsset en el disco rápidamente en iOS?

[[asset defaultRepresentation] fullResolutionImage]] 

Este CGImageRef retorno que quiero guardar en el disco lo más rápido posible ...

Solución 1:

UIImage *currentImage = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]]; 
NSData *currentImageData = UIImagePNGRepresentation(currentImage); 
[currentImageData writeToFile:filePath atomically:YES]; 

Solución 2:

CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:filePath]; 
CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypePNG, 1, NULL); 
CGImageDestinationAddImage(destination, [[asset defaultRepresentation] fullResolutionImage], nil); 
CGImageDestinationFinalize(destination); 

El problema es que ambos métodos son muy lento rendimiento en un dispositivo. Tomo unos 2 segundos por imagen para realizar esto. Y esto es absolutamente demasiado.

Pregunta: ¿Cómo puedo acelerar el proceso de guardar esta imagen? ¿O tal vez hay una mejor solución para esto?

ACTUALIZACIÓN: Los mejores mejoras de rendimiento en ambas soluciones es guardar imágenes en formato JPEG en lugar de PNG. Por lo tanto, para la solución 1 se ha reemplazado UIImagePNGRepresentation con UIImageJPEGRepresentation. Para la solución 2 se ha reemplazado kUTTypePNG con kUTTypeJPEG.

También vale la pena señalar que la segunda solución es mucho más eficiente con la memoria que la primera.

Respuesta

2

Eso es debido a que la compresión PNG es un proceso lento, y lleva un tiempo en el procesador de iPhone, especialmente para la fotografía de tamaño completo.

+0

Entiendo eso. Pero, ¿hay alguna otra manera más eficiente de hacer esto? No necesito PNG. En realidad, cualquier formato está bien. Solo necesito copiar la imagen original de ALAsset a mi carpeta personalizada ...? Gracias –

+0

¿Has probado UIImageJPEGRepresentation? –

+0

Acabo de intentar con la representación de JPEG, es aproximadamente la mitad más rápido que la representación PNG (todavía alrededor de 1 segundo). Esto es mucho mejor. Pero aún no es lo que esperaba. ¿Hay algo mas? ¿Qué pasa con la diferencia entre ambas soluciones que publiqué en cuestión? ¿Tiene alguna ventaja sobre otra? –

1

No hay tal manera de acelerar el proceso, pero una posible solución sería el uso de hilos, de esta manera usted no bloqueará el TrenzadoPrincipal y ofrecerá al usuario una mejor experiencia:

dispatch_queue_t dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(dispatchQueue, ^(void) { 
    // Your code here 
}); 
+0

Esto es lo que ya hice ... –

9

Puedes copiar los datos sin procesar en su lugar.
Esto tiene la ventaja de no recodificar el archivo, no hacer que el archivo sea más grande, no perder calidad a través de compresión adicional y preservar cualquier metadato en el archivo. También debería ser la forma más rápida posible.
Suponiendo que tiene theAsset y filepath para guardarlo.
Debe agregar el manejo de errores también.

long long sizeOfRawDataInBytes = [[theAsset defaultRepresentation] size]; 
NSMutableData* rawData = [NSMutableData dataWithLength:(NSUInteger) sizeOfRawDataInBytes]; 
void* bufferPointer = [rawData mutableBytes]; 
NSError* error=nil; 
[[theAsset defaultRepresentation] getBytes:bufferPointer 
           fromOffset:0 
            length:sizeOfRawDataInBytes 
            error:&error]; 
if (error) 
{ 
    NSLog(@"Getting bytes failed with error: %@",error); 
} 
else 
{ 
    [rawData writeToFile:filepath 
       atomically:YES]; 
} 
+0

El problema con esto es que la información de orientación de la imagen se pierde – rydgaze

+0

¿Estás seguro de que no está en los metadatos exif? – GusOst

+0

Esa información está de hecho en los datos de meta exif. – GusOst

Cuestiones relacionadas