Получить базовые NSData из UIImage

Я могу создать UIImage из NSData, используя методы [UIImage imageWithData:] или [UIImage initWithData:].

Интересно, смогу ли я вернуть NSData из существующего UIImage? Что-то вроде NSData *myData = [myImage getData];


person eugene    schedule 07.01.2011    source источник


Ответы (6)


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

or

NSData *imageData = UIImagePNGRepresentation(image);

В зависимости от того, нужны ли вам данные в формате PNG или JPG.

person Caroline    schedule 07.01.2011
comment
Я не знаю, почему за этот ответ так много голосов голосовали и почему его приняли. OP попросил извлечь данные, которые были предоставлены изначально. Использование UIImageJPEGRepresentation или UIImagePNGRepresentation приведет к изменению данных и выполнению повторного преобразования. Есть ли способ действительно достичь того, о чем просили? - person Patrik; 12.03.2013
comment
Этот ответ не годится, потому что он снизит качество изображения, если оно уже находится в формате с потерями. - person 1dayitwillmake; 17.07.2013
comment
@CipherCom Я понимаю, что вы говорите о возвращении точных данных. Однако я думаю, что для большинства людей, которые сталкиваются с вопросом, этот ответ будет идеальным для их нужд ... отсюда и положительные голоса. Если вы встретили ответ для возврата исходных данных, поделитесь, пожалуйста;) - person tybro0103; 06.03.2014
comment
@ 1dayitwillmake Даже PNG реп? Не в моей области знаний, но я думал, что PNG не теряются? - person tybro0103; 06.03.2014
comment
@Bob Spryn Это не поможет. Свойство CIImage устанавливается только в том случае, если оно было инициализировано с помощью imageWithCIImage :. Кроме того, это не непосредственно используемые данные, а скорее другой объект представления изображения. - person King-Wizard; 18.03.2015
comment
Так я единственный, кто этого не понимает? Я имею ввиду, что это? Это свойство HTML или фрагмент javascript, код C # и т. Д.? Не мог бы кто-нибудь объяснить это более подробно? (Кажется, было много положительных отзывов) Но каковы зависимости и куда вы помещаете этот код? - person Penjimon; 29.01.2018
comment
@Penjimon - это цель C - person Caroline; 31.01.2018
comment
Спасибо, что дали мне знать! На самом деле я понятия не имел. Кто-нибудь знает, как это сделать с C #? - person Penjimon; 31.01.2018

При инициализации объекта UIImage с помощью init(data: originalData) этот originalData будет преобразован в необработанные данные в каком-то внутреннем формате. Эти данные могут быть получены позже с помощью

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

Однако, поскольку rawData необработанный, он будет даже больше, чем при использовании UIImagePNGRepresentation.

person yesleon    schedule 24.02.2018
comment
как мне это сделать в Objective-C - person h3dkandi; 01.11.2018
comment
NSData * rawData = (__bridge NSData *) CGDataProviderCopyData (CGImageGetDataProvider (image.CGImage)); - person ZardozSpeaks; 03.08.2019
comment
@Zardoz Говорит, что вариант obj-c вполне жизнеспособен для включения в качестве редактирования в этот ответ. - person Kamil.S; 07.10.2019
comment
Это правильный ответ - person JBarros35; 01.07.2021

Вы можете ожидать, что UIImage - это объект, отформатированный для отображения, и поэтому не будут использовать исходные данные (которые, вероятно, находятся в формате PNG или JPEG), а скорее будут массивом пикселей или каким-либо другим внутренним форматом. Другими словами, UIImage(data: foo) не сохранит foo.

  1. Если вы просто хотите использовать его в другом месте своей программы, исходный UIImage подойдет (я полагаю, что здесь это не совсем так)

  2. Если вы хотите сериализовать, UIImagePNGRepresentation(...) будет работать, но будет увеличен, если оригинал был в формате JPEG; UIImageJPEGRepresentation(...) часто приводит к слегка завышенным размерам данных и небольшим потерям, если исходный файл был в формате PNG. Можно выбрать один, исходя из способа отображения изображения и формата, который вы ожидаете предоставить. Если вы используете PNG и хотите, чтобы PNG выгрузился, вы должны получить файл хорошего размера и почти идентичные данные, не считая специальных фрагментов PNG.

  3. Если вы хотите получить точную копию исходных данных (например, для сохранения файла после миниатюры или в SHA1), вам необходимо сохранить ее отдельно. Вы можете сделать что-то вроде:

    var image:UIImage
    var imageData:NSData {
        didSet {
            image = UIImage(data: imageData)
        }
    }
    
person Jim Driscoll    schedule 06.03.2016

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)
person maslovsa    schedule 17.04.2019

Просто потому, что наткнулась на это и мне нравится быстрый :)

Вот быстрый перевод сообщения Каройлин.

var imageData = UIImagePNGRepresentation(image)

Or

var imageData = UIImageJPEGRepresentation(image, 0.7) 
person nsij22    schedule 18.06.2015
comment
Вопрос не касался Свифта. - person Cross_; 03.07.2017

Все изменилось с тех пор, как был дан ответ выше, для тех, кто все еще ищет, потому что они разделяют озабоченность CipherCom: iOS 5 добавила свойство CIImage.

person Rafe    schedule 18.09.2013
comment
Я не вижу способа использовать CIImage для получения базовых NSData ... я что-то упускаю? - person tybro0103; 06.03.2014
comment
Это не поможет. Свойство CIImage устанавливается только в том случае, если оно было инициализировано с помощью imageWithCIImage:. Кроме того, это не непосредственно используемые данные, а скорее другой объект представления изображения. - person Patrik; 03.04.2014