Antworten:
NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality
oder
NSData *imageData = UIImagePNGRepresentation(image);
Je nachdem, ob Sie Ihre Daten im PNG- oder JPG-Format haben möchten.
Wenn Sie ein UIImage
Objekt mit initialisieren init(data: originalData)
, originalData
werden diese in Rohdaten in einem internen Format konvertiert. Diese Daten können später mit abgerufen werden
let rawData = myImage.cgImage?.dataProvider?.data as Data?
Da das rawData
jedoch roh ist, wird es noch größer sein als bei der Verwendung UIImagePNGRepresentation
.
Sie können davon ausgehen, dass ein UIImage ein für die Anzeige formatiertes Objekt ist und daher nicht die Originaldaten (wahrscheinlich im PNG- oder JPEG-Format) verwendet, sondern eher ein Pixelarray oder ein anderes internes Format. Mit anderen Worten, UIImage(data: foo)
wird nicht behalten foo
.
Wenn Sie es nur an einer anderen Stelle in Ihrem Programm verwenden möchten, ist das ursprüngliche UIImage in Ordnung (ich nehme an, dass dies hier nicht der Fall ist).
Wenn Sie serialisieren möchten, UIImagePNGRepresentation(...)
funktioniert dies, ist jedoch überdimensioniert, wenn das Original ein JPEG war. UIImageJPEGRepresentation(...)
führt häufig zu leicht übergroßen Daten und ist leicht verlustbehaftet, wenn Ihr Original PNG war. Es sollte in Ordnung sein, eine auszuwählen, basierend auf der Art und Weise, wie das Bild angezeigt wird und dem Format, das Sie voraussichtlich bereitstellen. Wenn Sie PNG verwenden und PNG ausgeben möchten, sollten Sie eine gute Dateigröße und nahezu identische Daten erhalten, abgesehen von speziellen PNG-Blöcken.
Wenn Sie eine genaue Kopie der Originaldaten erhalten möchten (möglicherweise, um eine Datei nach dem Miniaturbild zu speichern oder um sie zu SHA1 zu machen), müssen Sie sie separat aufbewahren. Sie könnten so etwas tun wie:
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)
Die Dinge haben sich geändert, seit die obige Antwort gegeben wurde, für diejenigen, die noch suchen, weil sie die Bedenken von CipherCom teilen: iOS 5 hat die CIImage-Eigenschaft hinzugefügt .
CIImage
wird nur festgelegt, wenn sie mit initialisiert wurde imageWithCIImage:
. Auch dies sind nicht direkt die verwendeten Daten, sondern ein anderes Bilddarstellungsobjekt.
UIImageJPEGRepresentation
oderUIImagePNGRepresentation
werden die Daten und machen einen Umstellungs verändern. Gibt es eine Möglichkeit, wirklich das zu erreichen, wonach gefragt wurde?