Odpowiedzi:
NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality
lub
NSData *imageData = UIImagePNGRepresentation(image);
W zależności od tego, czy chcesz, aby Twoje dane były w formacie PNG czy JPG.
Podczas inicjalizacji UIImage
obiektu za pomocą init(data: originalData)
, originalData
zostanie on przekonwertowany na surowe dane w jakimś wewnętrznym formacie. Te dane można pobrać później za pomocą
let rawData = myImage.cgImage?.dataProvider?.data as Data?
Jednak ponieważ rawData
jest surowy, będzie jeszcze większy niż podczas używania UIImagePNGRepresentation
.
Możesz oczekiwać, że UIImage jest obiektem sformatowanym do wyświetlania, a więc nie będzie używał oryginalnych danych (które prawdopodobnie są w formacie PNG lub JPEG), ale bardziej prawdopodobnie tablicy pikseli lub innego formatu wewnętrznego. Innymi słowy, UIImage(data: foo)
nie zachowa foo
.
Jeśli chcesz po prostu użyć go w innym miejscu w swoim programie, oryginalny UIImage będzie dobrze (zakładam, że tak nie jest w tym przypadku)
Jeśli chcesz serializować, UIImagePNGRepresentation(...)
będzie działać, ale będzie zbyt duży, jeśli oryginał był w formacie JPEG; UIImageJPEGRepresentation(...)
często powoduje nieznaczne przewymiarowanie danych i powoduje niewielkie straty, jeśli oryginał był w formacie PNG. Powinno być w porządku, aby wybrać taki w oparciu o sposób wyświetlania obrazu i oczekiwany format. Jeśli korzystasz z PNG i chcesz, aby PNG został usunięty, powinieneś uzyskać dobry rozmiar pliku i prawie identyczne dane, odkładając na bok specjalne fragmenty PNG.
Jeśli chcesz uzyskać dokładną kopię oryginalnych danych (na przykład, aby zapisać plik po utworzeniu miniatury lub do SHA1), musisz zachować je osobno. Możesz zrobić coś takiego:
var image:UIImage
var imageData:NSData {
didSet {
image = UIImage(data: imageData)
}
}
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)
Sytuacja zmieniła się od czasu udzielenia powyższej odpowiedzi, dla tych, którzy wciąż szukają, ponieważ podzielają obawy CipherCom: iOS 5 dodał właściwość CIImage .
CIImage
jest ustawiana tylko wtedy, gdy została zainicjowana za pomocą imageWithCIImage:
. Ponadto nie są to bezpośrednio używane dane, ale raczej inny obiekt reprezentujący obraz.
UIImageJPEGRepresentation
lubUIImagePNGRepresentation
spowoduje zmianę danych i dokonanie ponownej konwersji. Czy jest jakiś sposób, aby naprawdę osiągnąć to, o co proszono?