Экспорт очень больших изображений в iOS

Я работаю над приложением, которое использует представление с поддержкой CATiledLayer в UIScrollView, чтобы пользователь мог работать на произвольно большом холсте. Холст в основном содержит большую диаграмму блоков, которые пользователь может раскрашивать, выбирать, перемещать и т. д. Я заменяю draw(_ rect: CGRect), чтобы рисовать в представлении.

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

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

Вот как я сейчас создаю изображение:

// MyView is the view that is used in the scrollView
static func screenshotByDrawingItAgain(_ view: MyView) -> UIImage? {
    var image: UIImage?

    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, UIScreen.main.scale)

    guard let context = UIGraphicsGetCurrentContext() else {
        return nil
    }
    // This is where my chart data model is stored in memory
    guard let chart = view.chart else {
        return nil
    }

    // drawInRect is also called from MyView's draw(_:) method
    // so all drawing code is in one place
    view.drawInRect(context, with: chart, in: view.bounds, row: 0, col: 0)
    image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return image!
}

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

BOUNDS (10200.0, 6360.0)
CGBitmapContextInfoCreate: unable to allocate 1037952000 bytes for bitmap data

Большинство сообщений, которые я видел, посвящены тому, как читать большие изображения (например, фотографии) и отображать их. Мне не удалось найти никакой информации о том, как сделать обратное и получить изображение вида. Есть ли способ сгенерировать меньшие плитки представления в файл, а затем сшить их вместе и предоставить им доступ к полученному файлу? Спасибо!

вместо того, чтобы захватывать все содержимое представления в виде изображения, попробуйте захватить отдельные части, а затем объединить их в файл. Поскольку растровые изображения не сжимаются, как png или jpg, они могут занимать очень много места при таком выделении. Вроде бы сложно, но для вашей задачи оно достойно. Используйте CGRect вместо view.bounds

Cosmos Man 18.07.2018 06:31

Поэтому я определенно мог бы использовать drawInRect для создания меньшего изображения, поскольку он принимает CGRect, а затем что-то с этим делать. Любые указатели на то, как сгенерировать файл из этого прямоугольника, а затем объединить все эти файлы в одно изображение, которое не нужно считывать обратно в память. Второй шаг кажется более проблематичным ...

N.W 18.07.2018 06:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
272
0

Другие вопросы по теме