IMMAGINE COREARE CARICA IMMEDIATE I DATI DI IMMAGINE?
-
12-12-2019 - |
Domanda
Diciamo che voglio scoprire le dimensioni di un'immagine, quindi se un utente tenta di caricare un'immagine di 10.000x10.000 pixel nell'app per iPad, posso presentarli con una finestra di dialogo e non crash.Se faccio generacolotetagcode o [UIImage imageNamed:]
che caricherà immediatamente la mia immagine potenzialmente grande in memoria.
Se utilizzo invece l'immagine principale, dillo così:
CIImage *ciImage = [CIImage imageWithContentsOfURL:[NSURL fileURLWithPath:imgPath]];
.
Quindi chiedi il mio nuovo [UIImage imageWithContentsOfFile:]
per la sua taglia:
CGSize imgSize = ciImage.extent.size;
.
Caricherà l'intera immagine in memoria per dirmi questo, o guarderà solo i metadati del file per scoprire la dimensione dell'immagine?
Soluzione
La funzione imageWithContentsOfURL
carica l'immagine in memoria, sì.
Fortunatamente Apple implementato CGImageSource
per la lettura dei metadati dell'immagine senza caricare i dati del pixel effettivi in memoria in IOS4, è possibile leggere su come usarlo In questo post del blog (convenientemente fornisce un campione di codice su come ottenere dimensioni dell'immagine). Modifica: campione di codice incollato qui per proteggere da un collegamento ROT:
#import <ImageIO/ImageIO.h>
NSURL *imageFileURL = [NSURL fileURLWithPath:...];
CGImageSourceRef imageSource = CGImageSourceCreateWithURL((CFURLRef)imageFileURL, NULL);
if (imageSource == NULL) {
// Error loading image
...
return;
}
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:NO], (NSString *)kCGImageSourceShouldCache,nil];
CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, (CFDictionaryRef)options);
if (imageProperties) {
NSNumber *width = (NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelWidth);
NSNumber *height = (NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);
NSLog(@"Image dimensions: %@ x %@ px", width, height);
CFRelease(imageProperties);
}
.
Il riferimento API completo è Disponibile ancheQui .