Отримайте основні NSData від UIImage


104

Я можу створити UIImageза NSDataдопомогою [UIImage imageWithData:]або [UIImage initWithData:]методів.

Цікаво, чи зможу я отримати NSDataназад від існуючого UIImage? Щось на лініїNSData *myData = [myImage getData];

Відповіді:


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

або

NSData *imageData = UIImagePNGRepresentation(image);

Залежно від того, чи хочете ви свої дані у форматі PNG або JPG.


82
Я не знаю, чому цю відповідь так багато разів підкреслюють, або її не приймають. ОП попросила отримати дані, які були надані спочатку. Використання UIImageJPEGRepresentationабо UIImagePNGRepresentation буде змінювати дані і зробити зворотне перетворення. Чи є спосіб реально досягти того, про що просили?
Патрік

6
Ця відповідь не є корисною, оскільки вона знизить якість зображення, якщо воно вже є у втраченому форматі.
1dayitwillmake

@CipherCom Я бачу, що ви говорите про повернення точних даних. Однак, я думаю, що для більшості людей, які стикаються з питаннями, ця відповідь буде ідеальною для їх потреб ... отже, і відгуки. Якщо ви натрапили на відповідь про повернення оригінальних даних, будь ласка, поділіться;)
tybro0103

@ 1dayitwillmake Навіть представник PNG? Це не моя область знань, але я думав, що PNG не зазнають втрат?
tybro0103

@Bob Spryn Це не допоможе. Властивість CIImage встановлюється лише в тому випадку, якщо вона була ініціалізована з imageWithCIImage :. Також це не безпосередньо використовувані дані, а скоріше інший об’єкт подання зображення.
Король-Чарівник

21

При ініціалізації UIImageоб'єкта з init(data: originalData), який originalDataбуде перетворений на необроблені дані у якомусь внутрішньому форматі. Ці дані можна отримати згодом за допомогою

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

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


як це зробити в Objective-C
h3dkandi

NSData * rawData = (__bridge NSData *) CGDataProviderCopyData (CGImageGetDataProvider (image.CGImage));
ZardozSpeaks

@ZardozSpeaks варіант obj-c цілком життєздатний, щоб бути включеним як редагування у цю відповідь.
Каміль.S

6

Ви можете очікувати, що 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

Просто тому, що я натрапив на це і мені подобається стрімке :)

Ось швидкий переклад поста Кароліне.

var imageData = UIImagePNGRepresentation(image)

Або

var imageData = UIImageJPEGRepresentation(image, 0.7) 

Питання було не про швидке.
Хрест_

3

Швидкий 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)

-2

З моменту подання вищезгаданої відповіді все змінилося, тому що ті, хто все ще шукає, поділяють занепокоєння CipherCom: iOS 5 додав властивість CIImage .


Я не бачу способу використовувати CIImage, щоб отримати основні NSData ... я щось пропускаю?
tybro0103

4
Це не допоможе. Властивість CIImageвстановлюється лише в тому випадку, якщо вона була ініціалізована з imageWithCIImage:. Також це не безпосередньо використовувані дані, а скоріше інший об’єкт подання зображення.
Патрік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.