2012-06-29 20 views
6

Tengo un UIImagePickerController que permite al usuario elegir una imagen de la biblioteca de imágenes y obtengo sus resultados a través del método didFinishPickingMediaWithInfo.Usando UIImagePickerController para obtener una imagen, ¿cómo saber si guardar PNG o JPEG?

Necesito poder guardar la imagen resultante en el disco (en la carpeta de documentos de la aplicación) y volver a cargarla más tarde.

El problema es que no sé si almacenarlo como PNG o JPEG. No siempre puedo almacenarlo como PNG, porque para fotos más grandes es interminablemente lento (sin mencionar que tengo que ocuparme de almacenar la orientación de la imagen por separado). No puedo almacenarlo como JPEG, porque en algunos casos las imágenes tienen transparencia, que se perderá si lo hago.

He examinado la clave UIImagePickerControllerMediaType en el diccionario de información devuelto por el selector de imágenes, y sin importar si he seleccionado un archivo PNG o JPEG, lo que se devuelve es "image.public".

Entonces ...

¿Hay alguna manera de saber si el usuario ha elegido un PNG? ¿Tal vez algún método de solo verificar si la imagen tiene alguna transparencia o algo así?

Gracias.

Respuesta

2

en el diccionario la tecla UIImagePickerControllerReferenceURL le dará información sobre el tipo

(BGF) po información

{ 
    UIImagePickerControllerMediaType = "public.image"; 
    UIImagePickerControllerOriginalImage = "<UIImage: 0x5cfd00>"; 
    UIImagePickerControllerReferenceURL = "assets-library://asset/asset.JPG?id=EFC44C3C-9C82-4669-924B-A2B9DE6F1F45&ext=JPG"; 
} 

En este caso se trata de un archivo JPG como se muestra por ext = JPG

+0

I Terminé con la solución que he detallado anteriormente, sin embargo, esta es una información excelente, y habría hecho mi tarea un poco más directa. ¡Gracias! – DanM

6

OK, así que lo descubrí. Esto puede no funcionar para todos los escenarios, pero es suficiente para mí:

CGImageAlphaInfo imgAlpha = CGImageGetAlphaInfo(theImage.CGImage); 

    // Is this an image with transparency (i.e. do we need to save as PNG?) 
    if ((imgAlpha == kCGImageAlphaNone) || (imgAlpha == kCGImageAlphaNoneSkipFirst) || (imgAlpha == kCGImageAlphaNoneSkipLast)) { 
     // save as a JPEG 
    } else { 
     // save as a PNG 
    } 

... por supuesto es necesario recordar qué tipo de imagen que ha guardado, darle la extensión de archivo correspondiente y cargar la derecha de nuevo en ... pero básicamente esto se ocupa de eso. Las imágenes con transparencia se guardarán como PNG, todo lo demás como JPEG.

Si alguien tiene mejores métodos, me encantaría escucharlos. ¡Gracias!

Cuestiones relacionadas