GPUImage for Android
Goal is to have something as similar to GPUImage as possible. Vertex and fragment shaders are exactly the same. That way it makes it easier to port filters from GPUImage iOS to Android.
Requirements
Android 2.2 or higher (OpenGL ES 2.0)
Usage
Gradle dependency
repositories {
jcenter()
}
dependencies {
implementation 'jp.co.cyberagent.android:gpuimage:2.x.x'
}
Sample Code
With preview:
Java:
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
Uri imageUri = ...;
gpuImage = new GPUImage(this);
gpuImage.setGLSurfaceView((GLSurfaceView) findViewById(R.id.surfaceView));
gpuImage.setImage(imageUri); // this loads image on the current thread, should be run in a thread
gpuImage.setFilter(new GPUImageSepiaFilter());
// Later when image should be saved saved:
gpuImage.saveToPictures("GPUImage", "ImageWithFilter.jpg", null);
}
Kotlin:
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_gallery)
val imageUri: Uri = ...
gpuImage = GPUImage(this)
gpuImage.setGLSurfaceView(findViewById(R.id.surfaceView))
gpuImage.setImage(imageUri) // this loads image on the current thread, should be run in a thread
gpuImage.setFilter(GPUImageSepiaFilter())
// Later when image should be saved saved:
gpuImage.saveToPictures("GPUImage", "ImageWithFilter.jpg", null)
}
Using GPUImageView
android:id="@+id/gpuimageview"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:gpuimage_show_loading="false"
app:gpuimage_surface_type="texture_view" />
Java:
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
Uri imageUri = ...;
gpuImageView = findViewById(R.id.gpuimageview);
gpuImageView.setImage(imageUri); // this loads image on the current thread, should be run in a thread
gpuImageView.setFilter(new GPUImageSepiaFilter());
// Later when image should be saved saved:
gpuImageView.saveToPictures("GPUImage", "ImageWithFilter.jpg", null);
}
Kotlin:
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_gallery)
val imageUri: Uri = ...
gpuImageView = findViewById(R.id.gpuimageview)
gpuImageView.setImage(imageUri) // this loads image on the current thread, should be run in a thread
gpuImageView.setFilter(GPUImageSepiaFilter())
// Later when image should be saved saved:
gpuImageView.saveToPictures("GPUImage", "ImageWithFilter.jpg", null)
}
Without preview:
Java:
public void onCreate(final Bundle savedInstanceState) {
public void onCreate(final Bundle savedInstanceState) {
Uri imageUri = ...;
gpuImage = new GPUImage(context);
gpuImage.setFilter(new GPUImageSobelEdgeDetection());
gpuImage.setImage(imageUri);
gpuImage.saveToPictures("GPUImage", "ImageWithFilter.jpg", null);
}
Kotlin:
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_gallery)
val imageUri: Uri = ...
gpuImage = GPUImage(this)
gpuImage.setFilter(GPUImageSepiaFilter())
gpuImage.setImage(imageUri)
gpuImage.saveToPictures("GPUImage", "ImageWithFilter.jpg", null)
}
Support status of GPUImage for iOS shaders
Saturation
Contrast
Brightness
Levels
Exposure
RGB
RGB Diation
Hue
White Balance
Monochrome
False Color
Sharpen
Unsharp Mask
Transform Operation
Crop
Gamma
Highlights and Shadows
Haze
Sepia Tone
Amatorka
Miss Etikate
Soft Elegance
Color Inversion
Solarize
Vibrance
Highlight and Shadow Tint
Luminance
Luminance Threshold
Average Color
Average Luminance
Average Luminance Threshold
Adaptive Threshold
Polar Pixellate
Pixellate
Polka Dot
Halftone
Crosshatch
Sobel Edge Detection
Prewitt Edge Detection
Canny Edge Detection
Threshold Sobel EdgeDetection
Harris Corner Detector
Noble Corner Detector
Shi Tomasi Feature Detector
Colour FAST Feature Detector
Low Pass Filter
High Pass Filter
Sketch Filter
Threshold Sketch Filter
Toon Filter
SmoothToon Filter
Tilt Shift
CGA Colorspace Filter
Posterize
Convolution 3x3
Emboss Filter
Laplacian
Chroma Keying
Kuwahara Filter
Kuwahara Radius3 Filter
Vignette
Gaussian Blur
Box Blur
Bilateral Blur
Motion Blur
Zoom Blur
iOS Blur
Median Filter
Swirl Distortion
Bulge Distortion
Pinch Distortion
Sphere Refraction
Glass Sphere Refraction
Stretch Distortion
Dilation
Erosion
Opening Filter
Closing Filter
Local Binary Pattern
Color Local Binary Pattern
Dissolve Blend
Chroma Key Blend
Add Blend
Divide Blend
Multiply Blend
Overlay Blend
Lighten Blend
Darken Blend
Color Burn Blend
Color Dodge Blend
Linear Burn Blend
Screen Blend
Difference Blend
Subtract Blend
Exclusion Blend
HardLight Blend
SoftLight Blend
Color Blend
Hue Blend
Saturation Blend
Luminosity Blend
Normal Blend
Source Over Blend
Alpha Blend
Non Maximum Suppression
Thresholded Non Maximum Suppression
Directional Non Maximum Suppression
Opacity
Weak Pixel Inclusion Filter
Color Matrix
Directional Sobel Edge Detection
Lookup
Tone Curve (*.acv files)
Others
Texture 3x3
Gray Scale
Gradle
Make sure that you run the clean target when using maven.
gradle clean assemble
License
Copyright 2018 CyberAgent, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.