2011-08-27 13 views
16

Actualmente estoy dando mis primeros pasos con el desarrollo de iPhone a través de MonoTouch, estoy jugando con un UIImage que leo de la biblioteca de fotos.¿Detecta si un UIImage es PNG o JPEG?

Lo que quiero lograr es obtener la matriz de bytes sin formato (byte[]) de la imagen.

Sé que están las envolturas UIImageJPEGRepresentation y UIImagePNGRepresentation en MonoTouch. También sé cómo usarlos. Lo que no sé es:

¿Cómo decido cuál de estas dos funciones llamar?

I.e. si la imagen original es una imagen JPEG, no quiero obtenerla como PNG sino también como JPEG, y viceversa.

¿Hay alguna manera de hacerlo, o me faltan algunos puntos en esto?

Respuesta

26

Una vez que tiene un UIImage, es capaz de producir un JPEG o PNG usando UIImageJPEGRepresentation o UIImagePNGRepresentation. El formato de la imagen original solo es importante cuando se crea el UIImage a partir de él (decide qué proveedor de CFImage lo va a cargar).

Si es importante que su aplicación o algoritmo se asegure de guardarlo como el formato original, creo que debe mantener esa información para usar cuando la escriba. Comprobé dos veces y no pude encontrar nada que anunciara de qué formato venía.

¿Va a cambiar la imagen a través de UIImageView o la imagen no se modifica en su experiencia? Si no se cambia y solo necesita la interfaz de usuario para seleccionar la imagen, ¿podría obtener bytes de archivos? Por ejemplo, si mostró las imágenes solo para seleccionarlas y luego las sube a un servidor o algo, el UIImage solo puede ser para ver y seleccionar, y si su estructura de datos recuerda de qué archivo proviene, podría recuperar los bits. disco y carga. Si cambia el archivo en la vista, usted o el usuario deben decidir la salida (y si la calidad es jpeg) de la imagen.

+0

Gracias, @bryanmac Básicamente estoy escribiendo una pequeña herramienta para seleccionar una imagen de la biblioteca de fotos y subirlo a través de un servicio web. Así que no estoy produciendo la imagen, sino simplemente "consumiéndola". Tal vez podría obtener los bytes en bruto en algún lugar en el parámetro 'NSDictionary editingInfo' de 'FinishedPickingImage'. –

+1

Entonces, si tengo entendido, realmente no importa si la foto fue cargada originalmente como PNG o JPEG ... ¿una vez que obtiene el UIImage puede convertirlo a ambos formatos? – Fustigador

+1

Si hay un canal alfa, entonces querrá saber cuál usar. Tomé un jpeg y luego utilicé uiimage para mostrarlo y luego lo guardé en una base de datos local, retrospectivamente debería haberlo guardado en el disco, cualquiera que haya usado UIImagePNGRpresentación en lugar de UIImageJPEGRepresentation y luego intenté restaurarlo y esto es el resultado http://imgur.com/2yG3Zv2 Como puede ver, la transparencia se arruina. Como dije, probablemente debería haberlo guardado en el disco duro y haber guardado la ruta, pero el hecho es que, en algunos casos, sí importa la función que uses. – Biclops

1

PREPARAR

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

@property (assign, nonatomic) DownloadImageType imageType; 

DETECTAR

- (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) { 

} 
Cuestiones relacionadas