GitPedia

Android gpuimage plus

Android Image & Camera Filters Based on OpenGL.

From wysaid·Updated June 21, 2026·View on GitHub·

A C++ & Java library for `Image`/`Camera`/`Video` filters. PRs are welcomed. The project is written primarily in C, distributed under the MIT License license, first published in 2015. It has gained significant community traction with 1,924 stars and 475 forks on GitHub. Key topics include: android-gpuimage, cge, compute-shader, filter, image-processing.

Latest release: v3.2.0Release v3.2.0
March 11, 2026View Changelog →

Android-GPUImage-Plus

Contributors
Pull Requests Welcome

A C++ & Java library for Image/Camera/Video filters. PRs are welcomed.

New Features

v3.x adds CameraX support (CameraXProvider) and a unified zoom API (ICameraProvider.setZoomRatio).

screenshots screenshots

Gradle dependency

gradle
allprojects { repositories { maven { // Use github hosted maven repo for now. // Repo url: https://github.com/wysaid/android-gpuimage-plus-maven url 'https://maven.wysaid.org/' } } } // Choose only one of them dependencies { // Page size: 4KB (default) // Architectures: armeabi-v7a, arm64-v8a, x86, x86_64 // Full-featured with FFmpeg bundled implementation 'org.wysaid:gpuimage-plus:3.1.2' // Page size: 16KB // Architectures: armeabi-v7a, arm64-v8a, x86, x86_64 // Full-featured with FFmpeg bundled implementation 'org.wysaid:gpuimage-plus:3.1.2-16k' // Page size: 4KB (default) // Architectures: armeabi-v7a, arm64-v8a, x86, x86_64 // Image-only version (no video features or FFmpeg) implementation 'org.wysaid:gpuimage-plus:3.1.2-min' // Page size: 16KB // Architectures: armeabi-v7a, arm64-v8a, x86, x86_64 // Image-only version (no video features or FFmpeg) implementation 'org.wysaid:gpuimage-plus:3.1.2-16k-min' }

To compile other versions of ffmpeg, see: https://github.com/wysaid/FFmpeg-Android.git

Build

Quick start with Android Studio:

  1. Add usingCMakeCompile=true to local.properties
  2. Open the project in Android Studio
  3. Wait for NDK/CMake initialization
  4. Build and run

For detailed build instructions, configuration options, and alternative build methods (VS Code, command line, ndk-build), see docs/build.md.

Precompiled libraries: android-gpuimage-plus-libs
iOS version: ios-gpuimage-plus

Manual

1. Usage

Apply a filter with a rule string:

java
Bitmap srcImage = ...; // HSL Adjust (hue: 0.02, saturation: -0.31, luminance: -0.17) String ruleString = "@adjust hsl 0.02 -0.31 -0.17"; Bitmap dstImage = CGENativeLibrary.filterImage_MultipleEffects(srcImage, ruleString, 1.0f); // Save result ImageUtil.saveBitmap(dstImage);

2. Custom Shader Filter

2.1 Writing a Filter

Custom filters inherit from CGEImageFilterInterface:

cpp
// A simple color reversal filter class MyCustomFilter : public CGE::CGEImageFilterInterface { public: bool init() { CGEConstString fragmentShaderString = CGE_SHADER_STRING_PRECISION_H ( varying vec2 textureCoordinate; uniform sampler2D inputImageTexture; void main() { vec4 src = texture2D(inputImageTexture, textureCoordinate); src.rgb = 1.0 - src.rgb; // Reverse all channels gl_FragColor = src; } ); return m_program.initWithShaderStrings(g_vshDefaultWithoutTexCoord, fragmentShaderString); } };

See customFilter_N.cpp for a complete example.

2.2 Running a Custom Filter

In C++:

cpp
// Assumes GL context exists CGEImageHandlerAndroid handler; auto* customFilter = new MyCustomFilter(); customFilter->init(); handler.initWithBitmap(env, bitmap); handler.addImageFilter(customFilter); // Handler takes ownership handler.processingFilters(); jobject resultBitmap = handler.getResultBitmap(env);

If no GL context exists, use CGESharedGLContext.

In Java:

Use CGENativeLibrary.cgeFilterImageWithCustomFilter or CGEImageHandler directly.

3. Filter Rule Strings

Filter effects are defined by text-based rule strings. See docs/filter-rules.md for complete syntax reference.

Quick example:

java
// Chain multiple filters with @ separator String filter = "@curve RGB (0,0) (128,150) (255,255) " + "@adjust hsl 0.02 -0.31 -0.17 " + "@blend overlay texture.jpg 80";

4. Key Classes & Threading

ClassPurpose
CGENativeLibraryMain entry — static filter methods
CGEImageHandlerImage handler wrapper
CGEFrameRendererReal-time camera/video renderer
CGEFrameRecorderVideo recording (requires FFmpeg)

Important: GL operations must run on the GL thread:

java
glSurfaceView.queueEvent(() -> { // Your GL operations here });

Documentation

Tool

CGE-Tools — open-source desktop companion for creating and previewing CGE filter rules (macOS / Linux / Windows). Latest release: v2.0.0.

Tool

Contributors

This project is built with help from the open-source community. Contributions of code, documentation, tests, bug reports, and reviews are all welcome.

Contributors

License

MIT License

Contributors

Showing top 11 contributors by commit count.

View all contributors on GitHub →

This article is auto-generated from wysaid/android-gpuimage-plus via the GitHub API.Last fetched: 6/26/2026