2012-02-13 15 views
7

Sto usando ALAsset per recuperare le immagini del genere:Come salvare ALAsset immagine su disco velocemente su iOS?

[[asset defaultRepresentation] fullResolutionImage]] 

Questo ritorno CGImageRef che voglio salvare su disco il più velocemente possibile ...

Soluzione 1:

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

Soluzione 2:

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

Il problema è che entrambi i metodi sono esecuzione molto lenta su un dispositivo. Mi bastano circa 2 secondi per immagine per eseguire questo. E questo è assolutamente troppo lungo.

Domanda: Come posso accelerare questo processo di salvataggio delle immagini? O forse c'è una soluzione migliore per questo?

UPDATE: Le migliori miglioramenti delle prestazioni in entrambe le soluzioni è quello di salvare le immagini in formato JPEG, invece di PNG. Quindi per la soluzione 1 sono stati sostituiti UIImagePNGRepresentation con UIImageJPEGRepresentation. Per la soluzione 2 sono stati sostituiti kUTTypePNG con kUTTypeJPEG.

Vale anche la pena notare che la seconda soluzione è molto più efficiente in termini di memoria.

risposta

2

Questo a causa della compressione PNG è un processo lento e richiede un po 'di tempo per il processore di iPhone, soprattutto per le fotografie a grandezza naturale.

+0

Lo capisco. Ma c'è un altro modo più efficace per farlo? Non ho bisogno di PNG. In realtà qualsiasi formato è ok. Devo solo copiare l'immagine originale da ALAsset alla mia cartella personalizzata ...? Grazie –

+0

Hai provato UIImageJPEGRappresentazione? –

+0

Ho appena provato con la rappresentazione JPEG - è circa la metà più veloce della rappresentazione PNG (ancora circa 1 secondo). Questo è molto meglio. Ma ancora non quello che mi aspettavo. C'è niente altro? Che dire della differenza tra entrambe le soluzioni che ho postato in questione. Ha qualche vantaggio rispetto ad un altro? –

1

Non c'è un modo per accelerare il processo, ma una possibile soluzione potrebbe essere quella di utilizzare i thread, in questo modo non sarà possibile bloccare il mainthread e vi offrirà all'utente una migliore esperienza:

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

Questo è quello che ho già fatto ... –

9

Potresti semplicemente copiare i dati non elaborati.
Questo ha il vantaggio di non ricodificare il file, non di ingrandire il file, di non perdere la qualità attraverso la compressione aggiuntiva e di preservare i metadati nel file. Dovrebbe anche essere il modo più veloce possibile.
Supponendo di avere theAsset e un filepath per salvarlo in.
Dovrebbe aggiungere anche la gestione degli errori.

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

Il problema con questo è che le informazioni di orientamento dell'immagine sono perse – rydgaze

+0

Sei sicuro che non sia nei meta dati exif? – GusOst

+0

Queste informazioni sono effettivamente nei meta dati exif. – GusOst