UIImage'dan temel NSData alın


104

Ben oluşturabilir UIImagegelen NSDatakullanarak [UIImage imageWithData:]veya [UIImage initWithData:]yöntemler.

Acaba var olanın NSDataarkasını alabilir miyim UIImage? Satırında bir şeyNSData *myData = [myImage getData];

Yanıtlar:


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

veya

NSData *imageData = UIImagePNGRepresentation(image);

Verilerinizi PNG formatında veya JPG formatında isteyip istemediğinize bağlı olarak.


84
Bu cevabın neden bu kadar çok oy aldığını ve kabul edildiğini bilmiyorum. OP, başlangıçta verilen verilere erişmesini istedi. Kullanılması UIImageJPEGRepresentationveya UIImagePNGRepresentation olacak verileri değiştirebilir ve bir yeniden dönüşüm yapmak. İstenen şeyi gerçekten başarmanın bir yolu var mı?
Patrik

6
Bu cevap iyi değil çünkü zaten kayıplı bir formatta ise görüntünün kalitesini düşürecektir.
1dayitwillmake

@CipherCom Kesin verileri geri istemekle ilgili ne dediğini anlıyorum. Bununla birlikte, soruyla karşılaşan insanların çoğunluğu için bu cevabın ihtiyaçları için mükemmel olacağını düşünüyorum ... dolayısıyla olumlu oylar. Orijinal verileri geri almak için bir yanıtla karşılaşırsanız, lütfen paylaşın;)
tybro0103

@ 1dayitwillmake PNG temsilcisi bile mi? Benim uzmanlık alanım değil ama PNG'lerin kayıp yaşamadığını düşündüm.
tybro0103

@Bob Spryn Bu yardımcı olmayacak. 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 nesnesi.
King-Wizard

22

Bir UIImagenesneyi başlatırken init(data: originalData), bu bir originalDatatür dahili formatta ham veriye dönüştürülecektir. Bu veriler daha sonra ile alınabilir

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

Ancak rawDataham olduğu için , kullanımdan daha büyük olacaktır UIImagePNGRepresentation.


Bunu Objective-C'de nasıl yaparım
h3dkandi

NSData * rawData = (__bridge NSData *) CGDataProviderCopyData (CGImageGetDataProvider (image.CGImage));
ZardozSpeaks

@Zardoz Bu yanıta bir düzenleme olarak dahil edilmek için obj-c varyantının mükemmel şekilde uygun olduğunu söyler.
Kamil.S

6

Bir UIImage'ın görüntüleme için biçimlendirilmiş bir nesne olmasını ve bu nedenle orijinal verileri (muhtemelen PNG veya JPEG biçiminde) kullanmayacağını, ancak büyük olasılıkla bir piksel dizisi veya başka bir dahili biçimi kullanmayacağını bekleyebilirsiniz. Başka bir deyişle, UIImage(data: foo)tutmayacaktır foo.

  1. Bunu programınızda başka bir yerde kullanmak istiyorsanız, orijinal UIImage yeterli olacaktır (buradaki durumun aslında böyle olmadığını düşünüyorum)

  2. Serileştirmek istiyorsanız, UIImagePNGRepresentation(...)çalışacaktır ancak orijinal JPEG ise büyük boy olacaktır; UIImageJPEGRepresentation(...)genellikle biraz fazla büyük verilerle sonuçlanır ve orijinaliniz PNG ise biraz kayıp olur. Görüntünün gösterilme şekline ve sağlanmasını beklediğiniz formata bağlı olarak birini seçmenizde bir sakınca yoktur. PNG'yi kullanıyorsanız ve PNG'nin çıkmasını istiyorsanız, iyi bir dosya boyutu ve hemen hemen aynı veriler, özel PNG parçaları bir kenara bırakmalısınız.

  3. Orijinal verilerin tam bir kopyasını almak istiyorsanız (belki bir dosyayı küçük resimden sonra veya SHA1'e kaydetmek için), o zaman ayrı olarak saklamanız gerekir. Şöyle bir şey yapabilirsiniz:

    var image:UIImage
    var imageData:NSData {
        didSet {
            image = UIImage(data: imageData)
        }
    }

4

Sırf buna rastladığım ve hızlı olmayı sevdiğim için :)

İşte Caroiline'in gönderisinin hızlı çevirisi.

var imageData = UIImagePNGRepresentation(image)

Veya

var imageData = UIImageJPEGRepresentation(image, 0.7) 

Soru hızlı ile ilgili değildi.
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)

-2

CipherCom'un endişesini paylaştıkları için hala arayanlar için yukarıdaki cevap verildiğinden beri işler değişti: iOS 5, CIImage özelliğini ekledi .


Altta yatan NSData'yı almak için CIImage'ı kullanmanın bir yolunu görmüyorum ... Bir şey mi kaçırıyorum?
tybro0103

4
Bu yardımcı olmayacak. Özellik CIImageyalnızca ile başlatılmışsa ayarlanır imageWithCIImage:. Ayrıca bu doğrudan kullanılan veri değil, başka bir görüntü temsil nesnesi.
Patrik
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.