2011-01-07 9 views
91

Mogę utworzyć UIImage z NSData przy użyciu metody [UIImage imageWithdata:] lub [UIImage initWithData].Uzyskaj bazowe dane NSData * z UIImage

Zastanawiam się, czy mogę uzyskać NSData * z istniejącej UIImage *?
coś na linii NSData* myData = [myImage getData];

Czy to niemożliwe?
Dziękuję

Odpowiedz

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

lub

NSData *imageData = UIImagePNGRepresentation(image); 

zależności czy chcesz, aby dane w formacie PNG lub JPG.

+62

Nie wiem, dlaczego ta odpowiedź jest poddawana pod głosowanie tak wiele razy, ani że jest akceptowana. OP poprosił o pobranie danych, które zostały podane początkowo.Użycie 'UIImageJPEGRepresentation' lub' UIImagePNGRepresentation' ** ** zmieni dane i wykona konwersję. Czy jest jakiś sposób, aby naprawdę osiągnąć to, o co został poproszony? – CipherCom

+5

Ta odpowiedź nie jest dobra, ponieważ obniży jakość obrazu, jeśli jest już w formacie stratnym. – 1dayitwillmake

+0

@CipherCom Widzę, co chcesz powiedzieć o dokładnych danych. Jednak myślę, że dla większości osób, które zadają sobie pytanie, ta odpowiedź będzie idealna dla ich potrzeb ... a więc do przeżycia. Jeśli napotkasz odpowiedź na odzyskanie oryginalnych danych, udostępnij;) – tybro0103

-2

Rzeczy się zmieniły od czasu udzielenia powyższej odpowiedzi, dla tych, którzy wciąż szukają, ponieważ podzielają obawy CipherCom: iOS 5 dodał CIImage property.

+0

Nie widzę sposobu użycia CIImage, aby uzyskać podstawowe NSData ... czy brakuje mi czegoś? – tybro0103

+4

To nie pomoże. Właściwość '' CIImage'' jest ustawiana tylko wtedy, gdy została zainicjowana za pomocą '' imageWithCIImage: ''. Również nie jest to bezpośrednio używane dane, ale raczej inny obiekt reprezentacji obrazu. – CipherCom

3

Tylko dlatego, że natknąłem się na to i lubię szybki :)

Oto tłumaczenie Swift od słupka Caroiline użytkownika.

var imageData = UIImagePNGRepresentation(image) 

Albo

var imageData = UIImageJPEGRepresentation(image, 0.7) 
+0

Pytanie nie było o szybkim tempie. –

4

Można oczekiwać, że UIImage jest obiekt sformatowany do wyświetlania i tak nie będzie używać oryginalnych danych (co jest prawdopodobnie w formacie JPEG lub PNG), ale bardziej prawdopodobne tablica pikseli lub inny wewnętrzny format. Innymi słowy, UIImage(data: foo) nie zachowa foo.

  1. Jeśli po prostu chcesz go użyć w innym miejscu w programie, oryginalny UIImage zrobi porządku (Przypuszczam, że nie jest to rzeczywiście sprawa tutaj)

  2. Jeśli chcesz serialise, UIImagePNGRepresentation(...) będzie działać, ale będzie przewymiarowany, jeśli oryginał był JPEG; UIImageJPEGRepresentation(...) często powoduje nieznaczne nadmiarowe dane i jest lekko stratne, jeśli oryginał był w formacie PNG. Wybór jednego z nich powinien być w porządku w zależności od sposobu wyświetlania obrazu i formatu, który ma być dostarczony. Jeśli używasz PNG i chcesz, aby PNG się wydarzył, powinieneś dostać dobry rozmiar pliku i prawie identyczne dane, specjalne kawałki PNG na bok.

  3. Jeśli chcesz uzyskać dokładną kopię oryginalnych danych (być może, aby zapisać plik po miniaturowaniu lub do SHA1), musisz zachować go oddzielnie. Można zrobić coś takiego:

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

Podczas inicjalizacji do UIImage obiekt z init(data: originalData), że originalData zostanie przekształcony surowych danych w jakimś formacie wewnętrznym. Dane te mogą być pobierane później

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

Jednak ponieważ rawData jest surowy, to będzie jeszcze większa niż przy użyciu UIImagePNGRepresentation.