UIImage in NSData konvertieren

170

Ich verwende diesen Code in meiner App, der mir hilft, ein Bild zu senden.

Ich habe jedoch eine Bildansicht mit einem Bild. Ich habe keine Datei in Appbundle, aber das Bild auf meiner Seite. Wie kann ich den folgenden Code ändern? Kann mir jemand sagen , wie kann ich konvertieren myimagezu NSData?

// Attach an image to the email
NSString *path = [[NSBundle mainBundle] pathForResource:@"rainy" ofType:@"jpg"];
NSData *myData = [NSData dataWithContentsOfFile:path];
[picker addAttachmentData:myData mimeType:@"image/jpeg" fileName:@"rainy"];
Christina
quelle
2
UIImageJPEGRepresentation, UIImagePNGRepresentation beide geben nsdata des Bildes zurück .....
Himanshu Agnihotri

Antworten:

286

Probieren Sie je nach Bildformat eine der folgenden Möglichkeiten aus:

UIImageJPEGRepresentation

Gibt die Daten für das angegebene Bild im JPEG-Format zurück.

NSData * UIImageJPEGRepresentation (
   UIImage *image,
   CGFloat compressionQuality
);

UIImagePNGRepresentation

Gibt die Daten für das angegebene Bild im PNG-Format zurück

NSData * UIImagePNGRepresentation (
   UIImage *image
);

Hier die Dokumente .

BEARBEITEN:

Wenn Sie auf die Rohbytes zugreifen möchten, aus denen das UIImage besteht, können Sie diesen Ansatz verwenden:

CGDataProviderRef provider = CGImageGetDataProvider(image.CGImage);
NSData* data = (id)CFBridgingRelease(CGDataProviderCopyData(provider));
const uint8_t* bytes = [data bytes];

Dadurch erhalten Sie die Low-Level-Darstellung der Bild-RGB-Pixel. (Lassen Sie das CFBridgingReleaseBit weg, wenn Sie ARC nicht verwenden.)

Sergio
quelle
8
Gibt es eine Möglichkeit, die Daten in dem Format abzurufen, in dem sie bereits vorliegen?
Devios1
1
Xcode schlägt mir vor (id)CFBridgingRelease(CGDataProviderCopyData(provider)), das Eigentum an CDataRefzurückgegebenen CGDataProviderCopyDatain ARC zu übernehmen.
Mostruash
1
@mostruash: Danke, ich habe meine Antwort geändert, um Ihrem Vorschlag Rechnung zu tragen.
Sergio
@sergio Ich habe keine Erfahrung mit Nicht-ARC-Obj-C und frage mich, ob die Freigabe dataausreichen würde oder ob es immer noch einen Speicherverlust geben würde.
Mostruash
1
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
161
NSData *imageData = UIImagePNGRepresentation(myImage.image);
Radix
quelle
4
Ich benutze diese Linie, aber das ist sehr langsam
user2128531
5
Beachten Sie, dass imageFlags (wie imageOrientation) bei Verwendung von UIImagePNGRepresentation verloren gehen. Aus diesem Grund wird UIImageJPEGRepresentation bevorzugt.
Yony
26

Wenn Sie ein Bild in einer UIImageView haben, z. B. "myImageView", können Sie Folgendes tun:

Konvertieren Sie Ihr Bild mit UIImageJPEGRepresentation () oder UIImagePNGRepresentation () wie folgt:

NSData *data = UIImagePNGRepresentation(myImageView.image);
//or
NSData *data = UIImageJPEGRepresentation(myImageView.image, 0.8);
//The float param (0.8 in this example) is the compression quality 
//expressed as a value from 0.0 to 1.0, where 1.0 represents 
//the least compression (or best quality).

Sie können diesen Code auch in einen GCD-Block einfügen und in einem anderen Thread ausführen, wobei während des Vorgangs eine UIActivityIndicatorView angezeigt wird ...

//*code to show a loading view here*

dispatch_queue_t myQueue = dispatch_queue_create("com.my.queue", DISPATCH_QUEUE_SERIAL);

dispatch_async(myQueue, ^{ 

    NSData *data = UIImagePNGRepresentation(myImageView.image);
    //some code....

    dispatch_async( dispatch_get_main_queue(), ^{
        //*code to hide the loading view here*
    });
});
FormigaNinja
quelle
24

Erstellen Sie die Referenz des Bildes ....

UIImage *rainyImage = [UIImage imageNamed:@"rainy.jpg"];

Anzeigen von Bildern in der Bildansicht ... Imagedisplay ist eine Referenz der Bildansicht:

imagedisplay.image = rainyImage;

Konvertieren Sie es NSDatadurch Übergeben einer UIImageReferenz und stellen Sie die Komprimierungsqualität in Gleitkommawerten bereit:

NSData *imgData = UIImageJPEGRepresentation(rainyImage, 0.9);
Jemythehigh
quelle
2

Lösung in Swift 4

extension UIImage {
    var data : Data? {
      return cgImage?.dataProvider?.data as Data?
    }
}
Charlton Provatas
quelle
Wie werden die cgImage.dataProviderDaten verschlüsselt? Es scheint sich von den Daten von zu unterscheiden UIImagePNGRepresentationund UIImageJPEGRepresentationweil es nicht verwendet werden kann, um ein solches Bild zu erstellen UIImage(data: imageData).
Manuel
@ Manuel Nicht sicher. Ich habe gerade die Syntax von Sergios Antwort konvertiert. Sergio würde es wahrscheinlich besser wissen.
Charlton Provatas
@Manuel Ich gehe davon aus, dass es aufgrund der Verwendung der CoreGraphics-API eine niedrigere Datendarstellung des Bildes UIImageJPEGRepresentationliefert als vorgesehen. Ich glaube jedoch, dass diese Lösung das ursprüngliche Codierungsformat beibehält, in dem sich das Bild befand, und es nicht neu codiert.
Charlton Provatas
1

Verwenden Sie den if-let-Block mit Data, um einen Absturz der App und die sichere Ausführung von Code zu verhindern, da die Funktion UIImagePNGRepresentation einen optionalen Wert zurückgibt.

if let img = UIImage(named: "TestImage.png") {
    if let data:Data = UIImagePNGRepresentation(img) {
       // Handle operations with data here...         
    }
}

Hinweis: Daten sind Swift 3-Klasse. Verwenden Sie mit Swift 3 Daten anstelle von NSData

Generische Bildoperationen (wie png & jpg beide):

if let img = UIImage(named: "TestImage.png") {  //UIImage(named: "TestImage.jpg")
        if let data:Data = UIImagePNGRepresentation(img) {
               handleOperationWithData(data: data)     
        } else if let data:Data = UIImageJPEGRepresentation(img, 1.0) {
               handleOperationWithData(data: data)     
        }
}

*******
func handleOperationWithData(data: Data) {
     // Handle operations with data here...
     if let image = UIImage(data: data) {
        // Use image...
     }
}

Mit der Erweiterung:

extension UIImage {

    var pngRepresentationData: Data? {
        return UIImagePNGRepresentation(img)
    }

    var jpegRepresentationData: Data? {
        return UIImageJPEGRepresentation(self, 1.0)
    }
}

*******
if let img = UIImage(named: "TestImage.png") {  //UIImage(named: "TestImage.jpg")
      if let data = img.pngRepresentationData {
              handleOperationWithData(data: data)     
      } else if let data = img.jpegRepresentationData {
              handleOperationWithData(data: data)     
     }
}

*******
func handleOperationWithData(data: Data) {
     // Handle operations with data here...
     if let image = UIImage(data: data) {
        // Use image...
     }
}
Krunal
quelle
0
- (void) imageConvert
{
     UIImage *snapshot = self.myImageView.image;
     [self encodeImageToBase64String:snapshot];
}    


call this method for image convert in base 64 
    -(NSString *)encodeImageToBase64String:(UIImage *)image
    {
        return [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    }
Jayesh Mardiya
quelle