iOS: добавление изображений 6x6 400x300px к одному составному изображению - PullRequest
2 голосов
/ 08 мая 2011

Мой коллега-разработчик и я создаем приложение для iPhone, которое создает составное изображение. Идея состоит в том, чтобы иметь 36 изображений в сетке 6x6. Каждое оригинальное изображение имеет размер 400x300 пикселей. Следовательно, окончательное изображение после обработки должно быть 2400x1800px.

Отказ от ответственности: я сам не занимаюсь этим программированием. Мой коллега-программист не работает на SO, и по разным причинам я вынужден его попросить. Я лично разработчик .Net, так что простите мой вопрос, если это очевидно.

Теперь, видимо, это создает проблемы с памятью. До сих пор его решением были попытки нарисовать композицию в UIImageView или CATiledLayer и сохранить композицию, сделав снимок экрана с представлением. Все попытки до сих пор либо приводили к сбою приложения из-за проблем с памятью, либо создавали черные области в композиции.

Мой вопрос, по-видимому, прост. Как создать большое (за кадром?) Изображение, нарисовать 36 частичных изображений для этой композиции, сохранить композицию, а затем поместить ее в соответствующий компонент, который может просматривать пользователь?

Edit:

Мой приятель сам нашел решение в конце. Я выложу его здесь вместе с принятым ответом, чтобы внести свой вклад в SO wiki:)

UIGraphicsBeginImageContext(svPreview.contentSize);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(ctx, [[UIColor blackColor] CGColor]);
    CGContextFillRect(ctx, CGRectMake(0, 0, svPreview.contentSize.width, svPreview.contentSize.height));

    for(UIImageView *subview in [svPreview subviews]) {
        [subview.image drawAtPoint:subview.frame.origin];
    }

    UIImage *rawImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    UIImageWriteToSavedPhotosAlbum(rawImage, self, nil, nil);

1 Ответ

1 голос
/ 08 мая 2011

Очевидным механизмом будет UIScrollView. Это объект, предназначенный для отображения изображения или группы изображений, которые больше экрана, и он имеет легко реализуемую функциональность для масштабирования и прокрутки.

Хороший учебник вы найдете в Руководстве по программированию Apple Scroll View для iOS .

Вам просто нужно

  1. создать новый вид прокрутки
  2. присвойте свойству contentSize общий размер очень большого изображения, которое вы хотите отобразить
  3. добавьте одно большое изображение в качестве подпредставления или добавьте все маленькие изображения, расположив их соответствующим образом, чтобы они соответствовали друг другу

Если вы хотите создать одно большое изображение, вы можете просто создать большое настраиваемое представление того же размера, что и представление прокрутки contentSize. Затем нарисуйте каждое изображение в отдельной сетке. Наконец, добавьте этот большой пользовательский вид как подпредставление вида прокрутки.

Это очевидное решение, но оно может сделать все, что вам нужно, и предоставить вам дополнительную функциональность.

Редактировать: Представление прокрутки может быть хорошей отправной точкой, но вы все равно можете столкнуться с ограничениями памяти. Поиск ответов на вопросы о том, как повысить эффективность прокрутки, может оказаться полезным. Вы можете найти некоторые хорошие идеи в этом связанном вопросе: ScrollView не хватает памяти, когда он становится слишком большим

Редактировать 2: Способ управления памятью подробно, код и все, в вышеупомянутом руководстве. Взгляните на третий пример демонстрации ScrollViewSuite , посвященный плитке. Это должно работать идеально для вас, так как ваше изображение уже состоит из плиток.

Идея состоит в том, чтобы сделать вид таблицы из вида прокрутки, который теперь перерабатывает плитки изображений вместо ячеек. Представление прокрутки разделено на подклассы, и набор многократно используемых плиток сохраняется как одна из переменных его экземпляра. Ключом к реализации в layoutSubviews является удаление из суперпредставления плиток, которые переместились за пределы видимой области, затем утилизация плиток для вновь видимого содержимого и добавление их в качестве подпредставления. Таким образом, в память загружаются только видимые плитки.

Надеюсь, это работает для вас.

...