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


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

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

5 94

5 ответов:

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

или

NSData *imageData = UIImagePNGRepresentation(image);

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

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

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

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

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

    var image:UIImage
    var imageData:NSData {
        didSet {
            image = UIImage(data: imageData)
        }
    }
    

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

let rawData = myImage.cgImage?.dataProvider?.data as Data?
потому что rawData является raw, он будет еще больше, чем при использовании UIImagePNGRepresentation.

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

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

var imageData = UIImagePNGRepresentation(image)

или

var imageData = UIImageJPEGRepresentation(image, 0.7) 

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