В течение последних нескольких недель я разрывал свои волосы, пытаясь создать механизм для работы с плиточкой, работающий на iPhone. Мне нужно масштабировать и обрезать изображения размером около 150 мб, чтобы их можно было сохранить в виде плиток, которые будут запрашиваться в виде прокрутки, что позволит пользователю видеть изображение с высоким разрешением.Масштабирование и обрезка огромного изображения на iPhone
Проблема в том, что эти изображения действительно подталкивают границы того, что может обрабатывать iPhone. Кажется довольно легко масштабировать эти огромные изображения до 1000 или около того и делать эту черепицу, но для больших уровней масштабирования мне нужно масштабировать ее в середине, скажем, 4000, и это слишком велико. Поэтому я натолкнулся на идею создания блоков среднего размера из полноразмерного изображения и разбивки каждого из них и среднего масштаба.
Создавая autoreleasepool вокруг внутренних циклов и осушая его после каждого цикла, я могу в основном держать память под контролем, но иногда, и для меня это кажется случайным, память течет или, по крайней мере, не сливается. Я делаю все это на вторичном потоке, и когда он возвращается к первой функции в этом потоке, я освобождаю собственный autoreleasepool потока, и только тогда очищаются последние артефакты памяти. Это, похоже, не беспокоит симулятор, но iPhone гораздо менее прощает, и он падает, прежде чем он сможет завершить весь процесс черепицы. Кадрирование код, я использую от Hive05
http://www.hive05.com/2008/11/crop-an-image-using-the-iphone-sdk/
Кто-нибудь еще приходилось иметь дело с такими массивными изображениями раньше? Является ли предварительная генерация плитки лучшим способом? Любые предложения о том, почему некоторые циклы увеличивают память, а некоторые нет, или как заставить каждую автоматически выпущенную вещь очищаться от внутреннего пула, а не ждать внешнего пула?
Спасибо, что прочитали это.
для GOT, чтобы добавить эти изображения TIFs, поэтому, возможно прямое считывание информации растровый будет лучше, чем масштабирование и кадрирование всю вещь
Это может быть сделано на iPhone 3G. Это то, что у меня есть, и я могу плитку нескольких блоков среднего размера, прежде чем все станет слишком много для этого. И, в сущности, если он может плитку, он может их выложить. Мне просто нужно правильно очистить память между ними и повторить процесс. Я был так расстроен, пытаясь заставить петли не оставлять ничего позади. Я думаю, что функция C может быть следующим шагом, но я не знаю, как действовать дальше. – Craig