UIImage'ı NSData'ya dönüştür


170

Bir resim göndermeme yardımcı olacak uygulamamda bu kodu kullanıyorum.

Ancak, resimli bir resim görünümüm var. Appbundle dosya yok ama benim yanımda görüntü var. Aşağıdaki kodu nasıl değiştirebilirim? Ben dönüştürmek nasıl herkes bana söyleyebilir myimageiçin 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"];

2
UIImageJPEGRepresentation, UIImagePNGRepresentation her ikisi de görüntünün nsdata döndürür .....
Himanshu Agnihotri

Yanıtlar:


286

Görüntü biçiminize bağlı olarak aşağıdakilerden birini deneyin:

UIImageJPEGRepresentation

Belirtilen görüntünün verilerini JPEG biçiminde döndürür.

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

UIImagePNGRepresentation

PNG formatında belirtilen görüntü için veri döndürür

NSData * UIImagePNGRepresentation (
   UIImage *image
);

İşte dokümanlar .

DÜZENLE:

UIImage'ı oluşturan ham baytlara erişmek istiyorsanız, bu yaklaşımı kullanabilirsiniz:

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

Bu, görüntünün RGB piksellerinin düşük düzeyli sunumunu verecektir. ( CFBridgingReleaseARC kullanmıyorsanız biti atlayın ).


8
Verileri zaten hangi formatta olursa olsun almanın bir yolu var mı?
devios1

1
Xcode, ARC'de iade edilen (id)CFBridgingRelease(CGDataProviderCopyData(provider))mülkiyeti almak için kullanmamı önerir . CDataRefCGDataProviderCopyData
mostruash

1
@mostruash: teşekkürler, önerinizi dikkate almak için cevabımı değiştirdim.
sergio

@sergio ARC olmayan Obj-C ile tecrübeli değilim ve serbest bırakmanın datayeterli olup olmadığını veya hala bellek sızıntısı olup olmadığını merak ediyorum .
mostruash

1
Bu yardımcı olmaz. CIImage özelliği yalnızca imageWithCIImage: ile başlatılmışsa ayarlanır. Ayrıca bu doğrudan kullanılan veriler değil, başka bir görüntü temsil nesnesidir.
King-Wizard

161
NSData *imageData = UIImagePNGRepresentation(myImage.image);

4
Bu satırı kullanıyorum ama bu çok yavaş
user2128531 20:03

5
UIImagePNGRepresentation kullanılırken imageFlags (imageOrientation gibi) kaybolacağını unutmayın. Bu yüzden UIImageJPEGRepresentation tercih edilir.
Yony

26

UIImageView içinde bir görüntünüz varsa, örneğin "myImageView", aşağıdakileri yapabilirsiniz:

UIImageJPEGRepresentation () veya UIImagePNGRepresentation () kullanarak resminizi şu şekilde dönüştürün:

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

Ayrıca bu kodu bir GCD bloğunun içine koyabilir ve işlem sırasında bir UIActivityIndicatorView göstererek başka bir iş parçacığında yürütebilirsiniz ...

//*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*
    });
});

24

Resmin referansını oluşturun ....

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

görüntü görüntü görünümünde gösteriliyor ... imagedisplay , görüntülemenin referansıdır:

imagedisplay.image = rainyImage;

referansı NSDatageçerek dönüştürün UIImageve kayan nokta değerlerinde sıkıştırma kalitesi sağlayın:

NSData *imgData = UIImageJPEGRepresentation(rainyImage, 0.9);

2

Swift 4'te çözüm

extension UIImage {
    var data : Data? {
      return cgImage?.dataProvider?.data as Data?
    }
}

cgImage.dataProviderVeriler nasıl kodlanır? Verilerinden farklı olarak görünüyor UIImagePNGRepresentationve UIImageJPEGRepresentationbunu gibi bir görüntü oluşturmak için kullanılamaz çünkü UIImage(data: imageData).
Manuel

@Manuel Emin değilim. Senaryoyu Sergio'nun cevabından dönüştürdüm. Sergio muhtemelen daha iyisini bilirdi.
Charlton Provatas

@Manuel varsayıyorum çünkü CoreGraphics API kullanıyor, görüntünün UIImageJPEGRepresentationsağladığından daha düşük bir veri gösterimi sağlıyor. Ancak bu çözümün görüntünün içinde bulunduğu orijinal kodlama biçimini koruduğunu ve yeniden kodlamadığını düşünüyorum.
Charlton Provatas

1

UIImagePNGRepresentation işlevi isteğe bağlı bir değer döndürdüğü için, uygulama kilitlenmesini ve kodun güvenli bir şekilde yürütülmesini önlemek için if-let bloğunu Data ile kullanın.

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

Not: Veriler Swift 3 sınıfıdır. Swift 3 ile NSData yerine Veri kullanma

Genel görüntü işlemleri (png ve jpg gibi):

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

Uzantıyı kullanarak:

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

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];
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.