Dapatkan NSData yang mendasari dari UIImage

104

Saya dapat membuat UIImagedari NSDatapenggunaan [UIImage imageWithData:]atau [UIImage initWithData:]metode.

Saya ingin tahu apakah saya bisa mendapatkan NSDatakembali dari yang ada UIImage? Sesuatu yang dipertaruhkanNSData *myData = [myImage getData];

Eugene
sumber

Jawaban:

191
NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality

atau

NSData *imageData = UIImagePNGRepresentation(image);

Tergantung apakah Anda ingin data Anda dalam format PNG atau format JPG.

Caroline
sumber
82
Saya tidak tahu mengapa jawaban ini dipilih berkali-kali atau diterima. OP diminta untuk mengambil kembali data yang diberikan pada awalnya. Menggunakan UIImageJPEGRepresentationatau UIImagePNGRepresentation akan mengubah data dan melakukan konversi ulang. Adakah cara untuk benar-benar mencapai apa yang diminta?
Patrik
6
Jawaban ini kurang bagus, karena akan menurunkan kualitas gambar jika sudah dalam format lossy.
1dayitakan membuat
@CipherCom Saya mengerti apa yang Anda katakan tentang menginginkan data yang tepat kembali. Namun, saya pikir untuk sebagian besar orang yang menemukan pertanyaan, jawaban ini akan cocok untuk kebutuhan mereka ... karena itu suara positifnya. Jika Anda menemukan jawaban untuk mendapatkan kembali data asli, silakan bagikan;)
tybro0103
@ 1dayitwillake Bahkan perwakilan PNG? Bukan bidang keahlian saya, tapi menurut saya PNG tidak rugi?
tybro0103
@Bob Sparepart Ini tidak akan membantu. Properti CIImage hanya disetel jika diinisialisasi dengan imageWithCIImage :. Juga ini bukan data yang digunakan secara langsung melainkan objek representasi gambar lain.
King-Wizard
21

Saat menginisialisasi UIImageobjek dengan init(data: originalData), itu originalDataakan diubah menjadi data mentah dalam beberapa jenis format internal. Data ini dapat diambil nanti dengan

let rawData = myImage.cgImage?.dataProvider?.data as Data?

Namun karena rawDatamentah, itu akan menjadi lebih besar daripada saat digunakan UIImagePNGRepresentation.

yesleon
sumber
bagaimana cara melakukan ini di Objective-C
h3dkandi
NSData * rawData = (__bridge NSData *) CGDataProviderCopyData (CGImageGetDataProvider (image.CGImage));
ZardozSpeaks
@ZardozSpeaks menjelaskan varian obj-c yang secara sempurna dapat dimasukkan sebagai suntingan dalam jawaban ini.
Kamil.S
6

Anda dapat mengharapkan bahwa UIImage adalah objek yang diformat untuk tampilan dan karenanya tidak akan menggunakan data asli (yang mungkin dalam format PNG atau JPEG) tetapi lebih mungkin berupa larik piksel atau format internal lainnya. Dengan kata lain, UIImage(data: foo)tidak akan dipertahankan foo.

  1. Jika Anda hanya ingin menggunakannya di tempat lain di program Anda, UIImage asli akan baik-baik saja (saya kira sebenarnya tidak demikian di sini)

  2. Jika Anda ingin membuat serial, UIImagePNGRepresentation(...)akan berfungsi tetapi akan menjadi besar jika aslinya adalah JPEG; UIImageJPEGRepresentation(...)sering kali akan menghasilkan data yang sedikit terlalu besar dan sedikit merugikan jika aslinya adalah PNG. Seharusnya tidak masalah untuk memilih satu berdasarkan cara gambar akan ditampilkan dan format yang Anda harapkan disediakan. Jika Anda kebetulan menggunakan PNG dan ingin PNG, Anda harus mendapatkan ukuran file yang bagus dan data yang hampir sama, selain potongan PNG khusus.

  3. Jika Anda ingin mendapatkan salinan persis dari data asli (mungkin untuk menyimpan file setelah thumbnail, atau SHA1), maka Anda perlu menyimpannya secara terpisah. Anda mungkin melakukan sesuatu seperti:

    var image:UIImage
    var imageData:NSData {
        didSet {
            image = UIImage(data: imageData)
        }
    }
Jim Driscoll
sumber
4

Hanya karena saya tersandung pada ini dan saya suka cepat :)

Berikut adalah terjemahan cepat dari postingan Caroiline.

var imageData = UIImagePNGRepresentation(image)

Atau

var imageData = UIImageJPEGRepresentation(image, 0.7) 
nsij22.dll
sumber
Pertanyaannya bukan tentang kecepatan.
Cross_
3

Swift 4.2.0

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

Banyak hal telah berubah sejak jawaban di atas diberikan, bagi mereka yang masih mencari karena mereka memiliki kekhawatiran yang sama dengan CipherCom: iOS 5 telah menambahkan properti CIImage .

Rafe
sumber
Saya tidak melihat cara menggunakan CIImage untuk mendapatkan NSData yang mendasarinya ... apakah saya melewatkan sesuatu?
tybro0103
4
Ini tidak akan membantu. Properti CIImagehanya disetel jika diinisialisasi dengan imageWithCIImage:. Juga ini bukan data yang digunakan secara langsung melainkan objek representasi gambar lain.
Patrik