GPUImage — фреймворк для GPU-ускоренной обработки изображений на iOS
Репозиторий давно не обновлялся
Последнее обновление было 2 года назад.
Зачем нужен 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-шейдеры
Ключевые возможности
-
Готовые фильтры — 125 встроенных фильтров, разделенных на категории:
- Цветокоррекция (яркость, контраст, гамма и т.д.)
- Размытия (гауссово, боке, тилт-шифт)
- Эффекты (сепия, пикселизация, эскиз)
- Смешивание (умножение, наложение и другие режимы)
-
Работа с видео:
- Обработка потока с камеры в реальном времени
- Фильтрация и перекодирование видеофайлов
- Захват фото с применением фильтров
-
Кастомные шейдеры — можно создавать собственные фильтры на 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 использует цепочку обработки:
- Источники (GPUImageVideoCamera, GPUImagePicture и др.) загружают кадры в текстуры OpenGL ES
- Фильтры обрабатывают текстуры
- Результат выводится на экран, в 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 будет отличным выбором!
