2011-08-27 15 views
16

Attualmente faccio i miei primi passi con lo sviluppo di iPhone tramite MonoTouch, sto giocando con uno UIImage che ho letto dalla libreria di foto.Rileva se un UIImage è PNG o JPEG?

Quello che voglio ottenere è ottenere l'array di byte non elaborato (byte[]) dell'immagine.

So che ci sono i wrapper UIImageJPEGRepresentation e UIImagePNGRepresentation in MonoTouch. So anche come usarli. Quello che non so è:

Come decidere quale di queste due funzioni chiamare?

I.e. se l'immagine originale è un'immagine JPEG, non voglio ottenerla come PNG ma anche come JPEG e viceversa.

C'è un modo per farlo o mi mancano alcuni punti su questo?

risposta

26

Una volta che si dispone di un UIImage, è in grado di produrre un JPEG o PNG utilizzando UIImageJPEGRepresentation o UIImagePNGRepresentation. Il formato dell'immagine originale è importante solo quando UIImage viene creato da esso (decide quale provider CFImage caricarlo).

Se è importante per l'app o l'algoritmo assicurarsi di salvarlo come il formato originale, penso che sia necessario mantenere tali informazioni da utilizzare quando lo si scrive. Ho ricontrollato e non ho trovato nulla che pubblicizzava il formato da cui proveniva.

Hai intenzione di cambiare l'immagine tramite UIImageView o l'immagine rimane invariata nella tua esperienza? Se non è cambiato e hai solo bisogno dell'interfaccia utente per selezionare l'immagine, potresti arrivare a file byte? Ad esempio, se hai mostrato le immagini solo per selezionarle e poi le hai caricate su un server o qualcosa del genere, lo UIImage potrebbe essere solo per la visualizzazione e la selezione e se la struttura dei dati ricorda da quale file proviene, potresti recuperare i bit indietro disco e upload. Se si modifica il file nella vista, l'utente o l'utente deve decidere l'output (e se jpeg la qualità) dell'immagine.

+0

Grazie, @bryanmac Fondamentalmente sto scrivendo un piccolo strumento per selezionare un'immagine dalla libreria foto e caricarla attraverso un servizio web. Quindi non sto producendo l'immagine, ma semplicemente "consumandola". Forse potrei ottenere i byte grezzi da qualche parte nel parametro 'NSDictionary editingInfo' di" FinishPickingImage "? –

+1

Quindi, se ho capito, non importa se la foto è stata originariamente caricata come PNG o JPEG ... una volta che hai ottenuto UIImage puoi convertirlo in entrambi i formati? – Fustigador

+1

Se c'è un canale alfa, allora vuoi sapere quale usare. Ho preso un file jpeg e poi ho usato uiimage per visualizzarlo e poi lo ho salvato su un database locale, ho ripensato avrei dovuto salvarlo sul disco, chiunque usassi UIImagePNGRepresentation invece di UIImageJPEGRepresentation e più tardi ho provato a ripristinarlo e questo è il risultato http://imgur.com/2yG3Zv2 Come puoi vedere, la trasparenza è incasinata. Come ho detto, probabilmente dovrei semplicemente salvarlo su hdd e archiviare il percorso, ma il punto è che in alcuni casi importa quale funzione usi. – Biclops

1

PREPARARE

typedef NS_ENUM(NSInteger, DownloadImageType) { 
    DownloadImageTypePng, 
    DownloadImageTypeJpg 
}; 

@property (assign, nonatomic) DownloadImageType imageType; 

RILEVARE

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 

    NSString *compareString = [[info objectForKey:UIImagePickerControllerReferenceURL] absoluteString]; 
    NSRange pngRange = [compareString rangeOfString:@"PNG" options:NSBackwardsSearch]; 
    if (pngRange.location != NSNotFound) { 
     compareString = [compareString substringFromIndex:pngRange.location]; 
     self.imageType = DownloadImageTypePng; 
     NSLog(@"%@", compareString); 
    } else { 
     NSLog(@"Not PNG"); 
    } 

    NSRange jpgRange = [compareString rangeOfString:@"JPG" options:NSBackwardsSearch]; 
    if (jpgRange.location != NSNotFound) { 
     compareString = [compareString substringFromIndex:jpgRange.location]; 
     self.imageType = DownloadImageTypeJpg; 
     NSLog(@"%@", compareString); 
    } else { 
     NSLog(@"Not JPG"); 
    } 

} 

USO

if (self.imageType == DownloadImageTypePng) { 

} else if (self.imageType == DownloadImageTypeJpg) { 

} 
Problemi correlati