Получить базовый NSData из UIImage - PullRequest
97 голосов
/ 07 января 2011

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

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

Ответы [ 6 ]

185 голосов
/ 07 января 2011
NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality

или

NSData *imageData = UIImagePNGRepresentation(image);

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

14 голосов
/ 24 февраля 2018

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

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

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

6 голосов
/ 06 марта 2016

Можно ожидать, что 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)
        }
    }
    
4 голосов
/ 18 июня 2015

Просто потому, что я наткнулся на это и мне нравится Свифт :)

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

1 голос
/ 17 апреля 2019

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)
0 голосов
/ 18 сентября 2013

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

...