Можливості screen capture в ios пристроях
This post is also available in: Англійська

Функція Screen Capture, або, просто кажучи, «зняття зображення екрану», в мобільному додатку є потужний допоміжний інструмент і може використовуватися в найрізноманітніших завданнях. У цій статті ми детально розглянемо механізми, доступні для реалізації даного функціоналу.
За допомогою знімків або запису того, що відбувається на екрані можна створювати зручні керівництва, навчальні користувачів роботі зі складними додатками. Ефективність анімованих посібників, що наочно показують користувачеві, як саме потрібно використовувати функціонал додатка, набагато вище в порівнянні з простими текстовими «посібники для навчання». Підтримка і виправлення помилок програми може істотно спроститися, якщо разом з повідомленням про помилку користувач зможе відправляти запис своїх дій, що призводять до збою. Нарешті, багато любителів комп'ютерних ігор часто використовують запис з екрана для створення посібників з проходження рівнів або для демонстрації своїх досягнень.
Відображення або приховування UIGetScreenImage
У цій функції є тільки один недолік і, якби не він, то вона була б, мабуть, найкращим рішенням для зняття скріншотів. Недолік полягає в тому, що функція є частиною Private API, а значить, будь-який додаток, що використовує її, не зможе потрапити в App Store і дістатися до пристроїв користувачів.
Спосіб перший. Візуалізація шару UIView
Першим пунктом у списку йде метод класу CALayer для отримання вмісту шару у вигляді зображення - це метод
Використання цього методу з метою Screen Capture описано в QA QA1703 на сайті Apple. Цей метод просто зберігає вміст шару в поточний графічний контекст, після чого з контексту можна отримати безпосередньо зберігається там зображення. Отже, для будь-якого UIView можна зняти зображення його шару.
Нижче наведено приклад коду, який можна використовувати для отримання зображення з UIView.
Таким чином, перше запропоноване рішення є найбільш загальним, але не універсальним. Воно спрацює для інтерфейсу, побудованого в UIKit, але при наявності в додатку елементів з GPU, скріншот буде містити порожні області.
Cпособ другий. Отримання зображення з OpenGL ES

Як вже було зазначено, вміст сцен OpenGL знаходиться в області пам'яті графічного процесора. Тому для того, щоб отримати скріншот з вікна, в якому відображається графічна сцена, створена за допомогою фреймворка OpenGL ES, необхідний інший спосіб. Такий спосіб описаний в QA QA1704. Це функція glReadPixels.
Для отримання зображення сцени OpenGL необхідно виконати наступні кроки.
- Підключитися до потрібного буферу рендеринга (якщо використовується більше одного) за допомогою функції glBindRenderbufferOES.
- Виділити пам'ять під зображення потрібного розміру, враховуючи, що на кожну точку зображення відводиться по 4 байта.
- Скопіювати пікселі зображення в виділену область пам'яті за допомогою виклику функції glReadPixels.
- Оголосити виділену область «джерелом даних» шляхом вказівки посилання на джерело функцією CGDataProviderCreateWithData.
- Отримати CGImage з джерела даних за допомогою функції CGImageCreate.
Код, іллюстрірущій описану послідовність викликів, наведено нижче.
Маючи CGImage, можна легко отримати UIImage зображення і далі використовувати його в своїх цілях. Необхідно пам'ятати, що системи координат OpenGL ES і UIKit відрізняються напрямком осі Y. Тому скріншот перед використанням необхідно перевернути.
Спосіб третій. Зображення з камери пристрою

Що ж ми маємо в підсумку?

Існує, як мінімум, два підходи до вирішення такого завдання. Їх застосування залежить від типу плеєра.
Зняття зображень з плеєра MPMoviePlayer
- (UIImage *) thumbnailImageAtTime: timeOption.
Його опис можна знайти в офіційній документації. Він дозволяє задати час, відповідне необхідному кадру, а також визначити, який кадр вам важливіше отримати - найближчий до необхідного часу ключовий кадр або точний кадр по заданому часу. Виклик цього методу - все, що потрібно зробити для отримання скріншота.
Зняття зображень з плеєра AVPlayer
Перший спосіб - використовувати клас AVAssetImageGenerator. Він містить спеціальний метод
Приклад коду, який ілюструє цей підхід, наведений нижче.
Проблема з HTTP Live Streaming
У цій статті ми постаралися найбільш повно описати способи Screen Capture, доступні для використання в iOS.
Сподіваємося, що ви почерпнули багато корисної інформації з нашої статті і знайшли відповіді на ваші питання щодо Screen Capture в iOS.object