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?

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top