Holen Sie sich die zugrunde liegenden NSData von UIImage

104

Ich kann erstellen UIImageaus NSDatamit [UIImage imageWithData:]oder [UIImage initWithData:]Methoden.

Ich frage mich, ob ich NSDatavon einem bestehenden den Rücken bekommen kann UIImage? Etwas auf der Linie vonNSData *myData = [myImage getData];

Eugen
quelle

Antworten:

190
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.

Caroline
quelle
81
Ich weiß nicht, warum diese Antwort so oft hochgestimmt wird oder akzeptiert wird. Das OP bat darum, die ursprünglich angegebenen Daten abzurufen. Mit UIImageJPEGRepresentationoder UIImagePNGRepresentation werden die Daten und machen einen Umstellungs verändern. Gibt es eine Möglichkeit, wirklich das zu erreichen, wonach gefragt wurde?
Patrik
6
Diese Antwort ist nicht gut, da sie die Bildqualität verringert, wenn sie bereits in einem verlustbehafteten Format vorliegt.
1Tag wird
@CipherCom Ich verstehe, was Sie darüber sagen, dass Sie die genauen Daten zurückhaben möchten. Ich denke jedoch, dass diese Antwort für die Mehrheit der Menschen, die auf Fragen stoßen, perfekt für ihre Bedürfnisse ist ... daher die positiven Stimmen. Wenn Sie eine Antwort auf die
Rückgabe
@ 1dayitwillmake Auch der PNG-Repräsentant? Nicht mein Fachgebiet, aber ich dachte, PNGs erleiden keinen Verlust?
tybro0103
@ Bob Spryn Das wird nicht helfen. Die Eigenschaft CIImage wird nur festgelegt, wenn sie mit imageWithCIImage: initialisiert wurde. Auch dies sind nicht direkt die verwendeten Daten, sondern ein anderes Bilddarstellungsobjekt.
König-Zauberer
21

Wenn Sie ein UIImageObjekt mit initialisieren init(data: originalData), originalDatawerden 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 rawDatajedoch roh ist, wird es noch größer sein als bei der Verwendung UIImagePNGRepresentation.

yesleon
quelle
Wie mache ich das in Objective-C
h3dkandi
NSData * rawData = (__bridge NSData *) CGDataProviderCopyData (CGImageGetDataProvider (image.CGImage));
ZardozSpeaks
@ZardozSpeaks die obj-c-Variante, die perfekt als Bearbeitung in diese Antwort aufgenommen werden kann.
Kamil.S
6

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.

  1. 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).

  2. 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.

  3. 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)
        }
    }
Jim Driscoll
quelle
4

Nur weil ich darauf gestoßen bin und ich schnell mag :)

Hier ist die schnelle Übersetzung von Caroilines Beitrag.

var imageData = UIImagePNGRepresentation(image)

Oder

var imageData = UIImageJPEGRepresentation(image, 0.7) 
nsij22
quelle
Bei der Frage ging es nicht um schnell.
Cross_
3

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)
maslovsa
quelle
-2

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 .

Rafe
quelle
Ich sehe keine Möglichkeit, mit CIImage die zugrunde liegenden NSData abzurufen. Fehlt mir etwas?
tybro0103
4
Das wird nicht helfen. Die Eigenschaft CIImagewird nur festgelegt, wenn sie mit initialisiert wurde imageWithCIImage:. Auch dies sind nicht direkt die verwendeten Daten, sondern ein anderes Bilddarstellungsobjekt.
Patrik