Respostas:
NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality
ou
NSData *imageData = UIImagePNGRepresentation(image);
Dependendo se você quiser seus dados no formato PNG ou JPG.
Ao inicializar um UIImage
objeto com init(data: originalData)
, que originalData
será convertido em dados brutos em algum tipo de formato interno. Esses dados podem ser recuperados posteriormente com
let rawData = myImage.cgImage?.dataProvider?.data as Data?
No entanto, como o rawData
é cru, será ainda maior do que quando usado UIImagePNGRepresentation
.
Você pode esperar que um UIImage seja um objeto formatado para exibição e, portanto, não estará usando os dados originais (que provavelmente estão no formato PNG ou JPEG), mas mais provavelmente uma matriz de pixels ou algum outro formato interno. Em outras palavras, UIImage(data: foo)
não reterá foo
.
Se você quiser apenas usá-lo em outro lugar em seu programa, o UIImage original funcionará bem (presumo que não seja o caso aqui)
Se você quiser serializar, UIImagePNGRepresentation(...)
funcionará, mas ficará superdimensionado se o original for JPEG; UIImageJPEGRepresentation(...)
frequentemente resultará em dados um pouco maiores e com perdas se o original for PNG. Não há problema em escolher um com base na forma como a imagem será exibida e no formato que você espera que seja fornecido. Se acontecer de você estar usando PNG e quiser sair do PNG, você deve obter um bom tamanho de arquivo e dados quase idênticos, pedaços especiais de PNG à parte.
Se você deseja obter uma cópia exata dos dados originais (talvez para salvar um arquivo após a miniatura ou para SHA1), você precisa mantê-lo separadamente. Você pode fazer algo como:
var image:UIImage
var imageData:NSData {
didSet {
image = UIImage(data: imageData)
}
}
Swift 4.2
let dataPng = image.pngData() // return image as PNG. May return nil if image has no CGImageRef or invalid bitmap format
let dataJpg = image.jpegData(compressionQuality: 1) // return image as JPEG. May return nil if image has no CGImageRef or invalid bitmap format. compression is 0(most)..1(least)
As coisas mudaram desde que a resposta acima foi dada, para aqueles que ainda procuram, porque compartilham da preocupação da CipherCom: o iOS 5 adicionou a propriedade CIImage .
CIImage
só é definida se foi inicializada com imageWithCIImage:
. Também não são diretamente os dados usados, mas sim outro objeto de representação de imagem.
UIImageJPEGRepresentation
ouUIImagePNGRepresentation
irá alterar os dados e fazer uma reconversão. Existe alguma maneira de realmente alcançar o que foi pedido?