GPUImage — фреймворк для GPU-ускоренной обработки изображений на iOS

16 Feb, 2024

Репозиторий давно не обновлялся

Последнее обновление было 2 года назад.

20,295
🔱 4,557
👥 719

Зачем нужен GPUImage?

Представьте: вам нужно применить фильтр к видео в реальном времени на iPhone 4. Нативный Core Image справляется за 106 мс, а CPU-решение — за 460 мс. А с GPUImage тот же фильтр работает всего за 2.5 мс! Это в 40 раз быстрее Core Image и в 184 раза быстрее CPU.

Именно такую производительность предлагает GPUImage — фреймворк с открытым исходным кодом для обработки изображений и видео с использованием мощности GPU на iOS-устройствах.

Что это за проект?

GPUImage — это BSD-лицензированная библиотека для iOS, которая:

  • Позволяет применять GPU-ускоренные фильтры к изображениям, видео с камеры и записанным видеофайлам
  • Предоставляет простой Objective-C интерфейс вместо сложной настройки OpenGL ES 2.0
  • Поддерживает iOS начиная с версии 4.1
  • Позволяет создавать собственные фильтры через GLSL-шейдеры

Ключевые возможности

  1. Готовые фильтры — 125 встроенных фильтров, разделенных на категории:

    • Цветокоррекция (яркость, контраст, гамма и т.д.)
    • Размытия (гауссово, боке, тилт-шифт)
    • Эффекты (сепия, пикселизация, эскиз)
    • Смешивание (умножение, наложение и другие режимы)
  2. Работа с видео:

    Реклама
    • Обработка потока с камеры в реальном времени
    • Фильтрация и перекодирование видеофайлов
    • Захват фото с применением фильтров
  3. Кастомные шейдеры — можно создавать собственные фильтры на GLSL:

varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;

void main()
{
    // Пример сепия-фильтра
    lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
    lowp vec4 outputColor;
    outputColor.r = (textureColor.r * 0.393) + (textureColor.g * 0.769) + (textureColor.b * 0.189);
    outputColor.g = (textureColor.r * 0.349) + (textureColor.g * 0.686) + (textureColor.b * 0.168);    
    outputColor.b = (textureColor.r * 0.272) + (textureColor.g * 0.534) + (textureColor.b * 0.131);
    outputColor.a = 1.0;
    
    gl_FragColor = outputColor;
}

Технические детали

GPUImage использует цепочку обработки:

  1. Источники (GPUImageVideoCamera, GPUImagePicture и др.) загружают кадры в текстуры OpenGL ES
  2. Фильтры обрабатывают текстуры
  3. Результат выводится на экран, в UIImage или видеофайл

Основные компоненты:

  • GPUImageOutput — базовый класс для источников
  • GPUImageInput — протокол для фильтров
  • GPUImageView — UIView для отображения результата

Практическое применение

Фильтрация видео с камеры

GPUImageVideoCamera *videoCamera = [[GPUImageVideoCamera alloc] 
    initWithSessionPreset:AVCaptureSessionPreset640x480 
    cameraPosition:AVCaptureDevicePositionBack];
videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;

GPUImageFilter *customFilter = [[GPUImageFilter alloc] 
    initWithFragmentShaderFromFile:@"CustomShader"];
GPUImageView *filteredVideoView = [[GPUImageView alloc] 
    initWithFrame:CGRectMake(0.0, 0.0, viewWidth, viewHeight)];

[videoCamera addTarget:customFilter];
[customFilter addTarget:filteredVideoView];

[videoCamera startCameraCapture];

Обработка фото

UIImage *inputImage = [UIImage imageNamed:@"photo.jpg"];
GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage];
GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init];

[stillImageSource addTarget:stillImageFilter];
[stillImageFilter useNextFrameForImageCapture];
[stillImageSource processImage];

UIImage *filteredImage = [stillImageFilter imageFromCurrentFramebuffer];

GPUImage отлично подходит для:

  • Разработчиков мобильных приложений с обработкой фото/видео
  • Создания кастомных фильтров и эффектов
  • Проектов, где важна производительность

Плюсы:

  • Высокая производительность (GPU-ускорение)
  • Простой API
  • Поддержка кастомных шейдеров
  • Активное сообщество (20k+ звезд на GitHub)

Минусы:

  • Нет поддержки старых устройств (требуется OpenGL ES 2.0)
  • Некоторые сложные операции (например, большие размытия) могут работать медленнее Core Image

Если вам нужно быстро обрабатывать изображения на iOS — GPUImage будет отличным выбором!

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.