konversi UIImage ke NSData

170

Saya menggunakan kode ini di aplikasi saya yang akan membantu saya mengirim gambar.

Namun, saya memiliki tampilan gambar dengan gambar. Saya tidak memiliki file di appbundle tetapi memiliki gambar di sisi saya. Bagaimana saya bisa mengubah kode di bawah ini? Bisa ada yang bilang saya bagaimana saya dapat mengkonversi myimageke 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
sumber
2
UIImageJPEGRepresentation, UIImagePNGRepresentation keduanya mengembalikan nsdata gambar .....
Himanshu Agnihotri

Jawaban:

286

Coba salah satu dari yang berikut, tergantung pada format gambar Anda:

UIImageJPEGRepresentation

Mengembalikan data untuk gambar yang ditentukan dalam format JPEG.

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

UIImagePNGRepresentation

Mengembalikan data untuk gambar yang ditentukan dalam format PNG

NSData * UIImagePNGRepresentation (
   UIImage *image
);

Di sini dokumen .

EDIT:

jika Anda ingin mengakses byte mentah yang membentuk UIImage, Anda bisa menggunakan pendekatan ini:

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

Ini akan memberi Anda representasi tingkat rendah dari piksel gambar RGB. (Abaikan CFBridgingReleasebit jika Anda tidak menggunakan ARC).

sergio
sumber
8
Apakah ada cara untuk mendapatkan data dalam format apa pun yang sudah ada?
devios1
1
Xcode menyarankan saya untuk menggunakan (id)CFBridgingRelease(CGDataProviderCopyData(provider))untuk mengambil kepemilikan CDataRefdikembalikan oleh CGDataProviderCopyDatadi ARC.
mostruash
1
@mostruash: terima kasih, saya telah memodifikasi jawaban saya untuk memperhitungkan saran Anda.
sergio
@sergio Saya tidak berpengalaman dengan non-ARC Obj-C dan saya bertanya-tanya apakah melepaskannya datasudah cukup atau jika masih ada kebocoran memori.
mostruash
1
Ini tidak akan membantu. Properti CIImage hanya disetel jika diinisialisasi dengan imageWithCIImage :. Juga ini bukan secara langsung data yang digunakan tetapi objek representasi gambar lain.
King-Wizard
161
NSData *imageData = UIImagePNGRepresentation(myImage.image);
Akar
sumber
4
Saya menggunakan baris ini tetapi ini sangat lambat
user2128531
5
Perhatikan bahwa imageFlags (seperti imageOrientation) hilang saat menggunakan UIImagePNGRepresentation. Itu sebabnya UIImageJPEGRepresentation lebih disukai.
Yony
26

Jika Anda memiliki gambar di dalam UIImageView, mis. "MyImageView", Anda dapat melakukan hal berikut:

Konversi gambar Anda menggunakan UIImageJPEGRepresentation () atau UIImagePNGRepresentation () seperti ini:

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

Anda juga dapat memasukkan kode ini di dalam blok GCD dan mengeksekusi di utas lainnya, menampilkan UIActivityIndicatorView selama proses ...

//*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
sumber
24

Buat referensi gambar ....

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

menampilkan gambar dalam tampilan gambar ... imagedisplay adalah referensi dari tampilan gambar:

imagedisplay.image = rainyImage;

mengubahnya menjadi NSDatadengan melewati UIImagereferensi dan memberikan kualitas kompresi dalam nilai float:

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

Solusi dalam Swift 4

extension UIImage {
    var data : Data? {
      return cgImage?.dataProvider?.data as Data?
    }
}
Charlton Provatas
sumber
Bagaimana cgImage.dataProviderdata dikodekan? Tampaknya berbeda dari data UIImagePNGRepresentationdan UIImageJPEGRepresentationkarena tidak dapat digunakan untuk membuat gambar seperti itu UIImage(data: imageData).
Manuel
@ Manuel Tidak yakin. Saya baru saja mengonversi sintaksis dari jawaban Sergio. Sergio mungkin lebih tahu.
Charlton Provatas
@Manuel Saya berasumsi karena menggunakan CoreGraphics API itu memberikan representasi data tingkat rendah dari gambar daripada yang UIImageJPEGRepresentationdisediakan. Tapi saya percaya solusi ini mempertahankan format penyandian asli gambar itu dan tidak menyandikan ulang.
Charlton Provatas
1

Gunakan blok if-let dengan Data untuk mencegah aplikasi crash & eksekusi kode yang aman, karena fungsi UIImagePNGRepresentation mengembalikan nilai opsional.

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

Catatan: Data adalah kelas Swift 3. Gunakan Data alih-alih NSData dengan Swift 3

Operasi gambar umum (seperti png & jpg keduanya):

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

Dengan menggunakan ekstensi:

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
sumber
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
sumber