2011-01-07 14 views
91

Puedo crear UIImage de NSData utilizando el método [UIImage imageWithdata:] o [UIImage initWithData].Obtener NSData subyacente * de UIImage

Me pregunto si puedo recuperar NSData * de un UIImage * existente?
algo en la línea de NSData* myData = [myImage getData];

¿Es esto imposible?
Gracias

Respuesta

173
NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality 

o

NSData *imageData = UIImagePNGRepresentation(image); 

Dependiendo si desea que sus datos en formato PNG o JPG.

+62

No sé por qué esta respuesta se votó tantas veces ni que es aceptada. El OP pidió recuperar los datos que se le dieron inicialmente.El uso de 'UIImageJPEGRepresentation' o' UIImagePNGRepresentation' ** alterará ** los datos y realizará una reconversión. ¿Hay alguna manera de realmente lograr lo que se pidió? – CipherCom

+5

Esta respuesta no es buena, ya que reducirá la calidad de la imagen si ya está en un formato con pérdida. – 1dayitwillmake

+0

@CipherCom Veo lo que dice acerca de querer recuperar los datos exactos. Sin embargo, creo que para la mayoría de las personas que se topan con la pregunta, esta respuesta será perfecta para sus necesidades ... de ahí los votos a favor. Si encuentra una respuesta para recuperar los datos originales, comparta;) – tybro0103

-2

Las cosas han cambiado desde que se dio la respuesta anterior, para aquellos que todavía buscan porque comparten la preocupación de CipherCom: iOS 5 ha agregado el CIImage property.

+0

No veo una manera de usar CIImage para obtener NSData subyacente ... ¿me falta algo? – tybro0103

+4

Esto no ayudará. La propiedad '' CIImage'' solo se establece si se inicializó con '' imageWithCIImage: ''. Además, esto no es directamente los datos utilizados, sino más bien otro objeto de representación de imágenes. – CipherCom

3

El hecho de que me encontré con este veloz y me gusta :)

Aquí está la traducción rápida del puesto de Caroiline.

var imageData = UIImagePNGRepresentation(image) 

O

var imageData = UIImageJPEGRepresentation(image, 0.7) 
+0

La pregunta no era sobre la rapidez. –

4

Usted puede esperar que un UIImage es un objeto con formato de pantalla y por lo tanto no va a utilizar los datos originales (que es, probablemente, en formato PNG o JPEG) pero es más probable una matriz de píxeles u otro formato interno. En otras palabras, UIImage(data: foo) no retendrá foo.

  1. Si sólo desea utilizarlo en otra parte de su programa, el UIImage original, lo hará bien (supongo que en realidad no es el caso aquí)

  2. Si desea serializar, UIImagePNGRepresentation(...) funciona, pero será demasiado grande si el original fuera un JPEG; UIImageJPEGRepresentation(...) a menudo dará como resultado datos ligeramente sobredimensionados y es un poco con pérdida si su original fue PNG. Debería estar bien elegir uno según la forma en que se mostrará la imagen y el formato que espera que se proporcione. Si está utilizando PNG y quiere PNG, debe obtener un buen tamaño de archivo y datos casi idénticos, aparte de PNG especiales.

  3. Si desea obtener una copia exacta de los datos originales (tal vez para guardar un archivo después de la creación de miniaturas o SHA1), debe conservarlo por separado. Es posible hacer algo como:

    var image:UIImage 
    var imageData:NSData { 
        didSet { 
         image = UIImage(data: imageData) 
        } 
    } 
    
0

Al inicializar un objeto UIImage con init(data: originalData), que originalData se convertirán en los datos en bruto en algún tipo de formato interno. Estos datos pueden ser recuperados más tarde con

let rawData = myImage.cgImage?.dataProvider?.data as Data? 

Sin embargo debido a que el rawData es cruda, que va a ser aún mayor que cuando se utiliza UIImagePNGRepresentation.