Сжатие файла NSKeyedArchiver, включающего UIImageView с загруженным изображением

У меня есть представление с UIImageView. Он был загружен в формате jpg или png. Говорит, что версия изображения jpg имеет размер данных 100 КБ. Затем я использовал NSKeyedArchiver, чтобы сохранить свое представление в файл. Размер файла становится около 3 МБ. Если бы я использовал версию изображения png, архивный файл по-прежнему составлял около 3 МБ.

Затем я использовал zlib для сжатия заархивированного файла. Но, кажется, это не имеет большого эффекта.

Что-нибудь, что я могу сделать, чтобы вернуть его, чтобы максимально закрыть зону 100k?

Кстати: если я использовал UIWebView для загрузки изображения, то с версией изображения в формате jpg я получу архивный файл, очень близкий к исходному jpg.

РЕДАКТИРОВАТЬ: ответ Мэтта дал мне идею, и вот что я в итоге сделал:

Примечание: я еще не использовал подкласс UIImageView

  1. Создайте iVar для хранения NSData для изображения
  2. в encodeWithCoder перед вызовом [super encodeWithCoder...] установить self.image = nil; и установите self.image обратно в данные изображения, используя сохраненные NSData в 1.
  3. обязательно закодируйте NSData iVar в 1.

В initWithCoder, используя NSData iVar для восстановления изображения.


person user523234    schedule 12.05.2013    source источник
comment
Причина, по которой он составляет 3 МБ, несомненно, в том, что вы сохраняете его несжатым. Неважно, какой у вас исходный файл. UIImage может понимать только растровое изображение, поэтому вы будете сохранять его. Как говорит Мэтт, зачем вам вообще это нужно?   -  person borrrden    schedule 13.05.2013
comment
В этом случае мне нужно использовать NSKeyedArchiver. Но посмотрите мой РЕДАКТИРОВАТЬ.   -  person user523234    schedule 13.05.2013


Ответы (1)


Для этого не нужен архиватор с ключом.

Если изображение пришло из вашего приложения, у вас уже есть файл изображения, поэтому сохранять нечего; просто заархивируйте имя изображения.

Если изображение пришло, скажем, из Интернета, все, что вам действительно нужно сделать, это сохранить исходное изображение в файл (и, опять же, возможно, заархивировать путь к файлу, чтобы вы могли восстановить его позже). В какой-то момент у вас было изображение JPG размером 100 КБ, так почему бы просто не захватить его в то время, когда оно у вас есть? Если он прибыл как NSData, что ж, вот ваши данные. Если нет, вы можете преобразовать его в данные JPEG с помощью UIImageJPEGRepresentation. В любом случае NSData можно сохранить непосредственно в файл.

Однако наиболее гибкий и мощный способ сохранения (и последующего чтения) данных изображений — это платформа ImageIO.

person matt    schedule 13.05.2013
comment
Что ж, в этом случае мне нужно использовать архиватор с ключом ... Но ваш ответ мне кое-что напомнил ... NSData, поэтому я нашел работающее решение на его основе. Спасибо. Смотрите мое редактирование, если вам интересно. - person user523234; 13.05.2013