Відповіді:
NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality
або
NSData *imageData = UIImagePNGRepresentation(image);
Залежно від того, чи хочете ви свої дані у форматі PNG або JPG.
При ініціалізації UIImage
об'єкта з init(data: originalData)
, який originalData
буде перетворений на необроблені дані у якомусь внутрішньому форматі. Ці дані можна отримати згодом за допомогою
let rawData = myImage.cgImage?.dataProvider?.data as Data?
Однак, оскільки rawData
сирий, він буде ще більшим, ніж при використанні UIImagePNGRepresentation
.
Ви можете очікувати, що UIImage - це об'єкт, відформатований для відображення, і тому він не буде використовувати вихідні дані (можливо, у форматі PNG або JPEG), але, швидше за все, піксельний масив або інший внутрішній формат. Іншими словами, UIImage(data: foo)
не збережеться foo
.
Якщо ви просто хочете використовувати його в іншому місці вашої програми, оригінальний UIImage буде добре (я припускаю, що це насправді не так)
Якщо ви хочете серіалізувати, UIImagePNGRepresentation(...)
буде працювати, але буде розміром з великим розміром, якщо оригінал був JPEG; UIImageJPEGRepresentation(...)
часто призводить до незначних розмірів даних і трохи втрачає, якщо ваш оригінал був PNG. Вибирайте одне, залежно від способу відображення зображення та формату, який ви очікуєте. Якщо ви використовуєте PNG і хочете отримати PNG, вам слід отримати хороший розмір файлу та майже однакові дані, спеціальні відрізки PNG.
Якщо ви хочете отримати точну копію оригінальних даних (можливо, щоб зберегти файл після ескізів або до SHA1), тоді вам потрібно зберегти його окремо. Ви можете зробити щось на кшталт:
var image:UIImage
var imageData:NSData {
didSet {
image = UIImage(data: imageData)
}
}
Швидкий 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)
З моменту подання вищезгаданої відповіді все змінилося, тому що ті, хто все ще шукає, поділяють занепокоєння CipherCom: iOS 5 додав властивість CIImage .
CIImage
встановлюється лише в тому випадку, якщо вона була ініціалізована з imageWithCIImage:
. Також це не безпосередньо використовувані дані, а скоріше інший об’єкт подання зображення.
UIImageJPEGRepresentation
абоUIImagePNGRepresentation
буде змінювати дані і зробити зворотне перетворення. Чи є спосіб реально досягти того, про що просили?