UIImage из NSInputStream

Я загружаю изображение 2400x1600 из Parse и не хочу, чтобы все эти данные хранились в памяти одновременно. Объект PFFile из Parse имеет удобный метод для получения NSData как NSInputStream, поэтому, когда данные наконец загружены, я получаю NSInputStream. Итак, теперь я хочу использовать этот NSInputStream для получения моего UIImage. Это должно работать как создание UIImage с содержимым файлового метода, т.е. не все изображение загружается в память сразу. Я думаю, что запись в файл из NSInputStream, а затем использование метода содержимого файла UIImage, должна работать нормально в моем случае, но я не нашел способа записи в файл из NSInputStream.

Любой пример кода или какое-либо руководство будут действительно оценены.

Заранее спасибо.


person mdonati    schedule 13.01.2014    source источник
comment
Конечно, все изображение будет в памяти, когда вы его отображаете. Размер дисплея, вероятно, будет ~ 15 МБ, что во много раз превышает размер загружаемого файла.   -  person zaph    schedule 13.01.2014


Ответы (2)


Для этого вы можете настроить NSOutputStream для потоковой передачи полученных данных в файл. Создайте свой выходной поток, используя initToFileAtPath:append: с YES для добавления. В обратном вызове потока ввода передайте данные в поток вывода, вызвав write:maxLength: (подробнее читайте в документации). После завершения потока у вас будет полное изображение в файле, но оно никогда не будет полностью в памяти.

Ответ Анри выше более уместен, поскольку вы используете Parse, но это общее решение.

person Patrick Goley    schedule 13.01.2014

В документации по iOS/OS X Parse приводит этот пример.

Восстановление изображения включает вызов одного из вариантов getData в PFFile. Здесь мы извлекаем файл изображения из другого UserPhoto с именем otherPhoto:

PFFile *userImageFile = anotherPhoto[@"imageFile"];
[userImageFile getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error) {
    if (!error) {
        UIImage *image = [UIImage imageWithData:imageData];
    }
}];

Теперь я не совсем понимаю, почему вы используете NSInputStream, в основном по двум причинам:

  1. NSInputStream якобы предназначен для ВВОДА данных, а не для их взятия откуда-то
  2. NSInputStream предназначен для потоковой передачи, поэтому для сценариев, в которых вы хотите что-то делать с данными по мере их поступления, из вашего описания кажется, что вы заботитесь о данных только после завершения их загрузки.

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

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

person Henri Normak    schedule 13.01.2014