Возможно ли мозаичное изображение в UIScrollView без необходимости вручную создавать все плитки? - PullRequest
14 голосов
/ 26 июля 2010

В образце кода iPhone « PhotoScroller » из WWDC 2010 они показывают, как сделать довольно неплохую мимику из приложения «Фотографии» с помощью прокрутки, масштабирования и подкачки изображений. Они также наносят изображения на плитки, чтобы показать, как отображать изображения с высоким разрешением и поддерживать хорошую производительность.

Черепица реализована в примере кода путем захвата предварительно масштабированных и вырезанных изображений для разных разрешений и размещения их в сетке, которая составляет все изображение.

Мой вопрос: есть ли способ мозаичного изображения без необходимости вручную просматривать все ваши фотографии и создавать «плитки»? Как приложение «Фото» может отображать большие изображения на лету?

Редактировать Вот код из ответа Дипы ниже:

- (UIImage *)tileForScale:(float)scale row:(int)row col:(int)col size:(CGSize)tileSize  image:(UIImage *)inImage
{
CGRect subRect = CGRectMake(col*tileSize.width, row * tileSize.height, tileSize.width, tileSize.height);
CGImageRef tiledImage = CGImageCreateWithImageInRect([inImage CGImage], subRect);
UIImage *tileImage = [UIImage imageWithCGImage:tiledImage]; 
return tileImage;
}

Ответы [ 5 ]

12 голосов
/ 08 декабря 2010

Вот код для генерации мозаичного изображения:

В исходном коде PhotoScroller замените tileForScale: row: col: следующим:

inImage - изображение, которое вы хотите создать плитки

- (UIImage *)tileForScale: (float)scale row: (int)row column: (int)col size: (CGSize)tileSize image: (UIImage*)inImage
{
    CGRect subRect = CGRectMake(col*tileSize.width, row * tileSize.height, tileSize.width, tileSize.height);
    CGImageRef tiledImage = CGImageCreateWithImageInRect([inImage CGImage], subRect);
    UIImage *tileImage = [UIImage imageWithCGImage: tiledImage];
    return tileImage;
}

С уважением, Deepa

5 голосов
/ 28 июля 2010

Я обнаружил, что это может помочь: http://www.mikelin.ca/blog/2010/06/iphone-splitting-image-into-tiles-for-faster-loading-with-imagemagick/

Вы просто запускаете его в Terminal как скрипт оболочки на вашем Mac.

3 голосов
/ 27 ноября 2011

Ответ Дипы, приведенный выше, загрузит все изображение в память как UIImage (входная переменная в его функции), победив цель тайлинга.

3 голосов
/ 03 сентября 2010

Извините, Иона, но я думаю, что вы не можете делать то, что хотите.

Я реализовывал комическое приложение, используя тот же пример в качестве справочного материала, и у меня были те же сомнения.Наконец, я понял, что даже если вы можете загрузить изображение и разрезать его на плитки при первом использовании, вы не должны этого делать.Для этого есть две причины:

  1. Вы выполняете тайлинг, чтобы сэкономить время и быть более отзывчивым.Загрузка и укладка мозаичного изображения занимает много времени.
  2. Предыдущая причина особенно важна при первом запуске приложения пользователем.

Если эти две причины не имеют смысла для вас, иВы все еще хотите сделать это, я бы использовал Quartz для создания плиток.Функция CGImage CGImageCreateWithImageInRect будет моей отправной точкой.

2 голосов
/ 10 сентября 2010

Многие форматы изображений поддерживают декодирование по регионам.Вместо загрузки всего изображения в память, распаковки всего объекта и удаления всего, кроме области интереса (ROI), вы можете загружать и декодировать только ROI по требованию.По большей части это устраняет необходимость предварительно генерировать и сохранять плитки изображений.Я никогда не работал с ImageMagick, но я был бы удивлен, если бы он не смог этого сделать.(Я сделал , используя API Java Advanced Imaging (JAI), который не поможет вам на iPhone ...)

Я играл с примером PhotoScrollerи способ, которым он работает с предварительно сгенерированными плитками, заключается только в том, чтобы продемонстрировать идею CATiledLayer и создать работающий автономный проект.Заменить стратегию загрузки мозаики изображений несложно - просто перепишите метод TilingView tileForScale:row:col:, чтобы вернуть плитку UIImage из какого-либо другого источника, будь то Quartz или ImageMagick или любой другой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...