Я могу создать UIImage
из NSData
, используя методы [UIImage imageWithData:]
или [UIImage initWithData:]
.
Интересно, смогу ли я вернуть NSData
из существующего UIImage
? Что-то вроде NSData *myData = [myImage getData];
Я могу создать UIImage
из NSData
, используя методы [UIImage imageWithData:]
или [UIImage initWithData:]
.
Интересно, смогу ли я вернуть NSData
из существующего UIImage
? Что-то вроде NSData *myData = [myImage getData];
NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality
or
NSData *imageData = UIImagePNGRepresentation(image);
В зависимости от того, нужны ли вам данные в формате PNG или JPG.
UIImageJPEGRepresentation
или UIImagePNGRepresentation
приведет к изменению данных и выполнению повторного преобразования. Есть ли способ действительно достичь того, о чем просили?
- person Patrik; 12.03.2013
При инициализации объекта 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)
}
}
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)
Просто потому, что наткнулась на это и мне нравится быстрый :)
Вот быстрый перевод сообщения Каройлин.
var imageData = UIImagePNGRepresentation(image)
Or
var imageData = UIImageJPEGRepresentation(image, 0.7)
Все изменилось с тех пор, как был дан ответ выше, для тех, кто все еще ищет, потому что они разделяют озабоченность CipherCom: iOS 5 добавила свойство CIImage.
CIImage
устанавливается только в том случае, если оно было инициализировано с помощью imageWithCIImage:
. Кроме того, это не непосредственно используемые данные, а скорее другой объект представления изображения.
- person Patrik; 03.04.2014