GPU accelerated filters for iOS based on OpenGL.
New feature: Face effects will be created with the ios11's VNSequenceRequestHandler
& VNDetectFaceLandmarksRequest
.
Android version: https://github.com/wysaid/android-gpuimage-plus
-
This repo is open source now. You can use cge.framework in your project.
- You can add the cge.framework to your project, then add the code
#import <cge/cge.h> //Everything is done.
- If you're using CocoaPods, add this to your Podfile:
pod 'cge', :git => 'https://github.com/wysaid/ios-gpuimage-plus.git'
or with the latest static library:
pod 'cge', :git => 'https://github.com/wysaid/ios-gpuimage-plus-pod.git', :tag => '2.5.1'
Dependencies: libc++, ImageIO.framework, MobileCoreServices.framework
Note: The filters are written in C++, so you should change your source file extensions to "mm" if you want use all features. But it is not necessary when you're using the interface-headers just like the demo.
-
Hundreds of built-in filters are available in the demo. 😋If you'd like to add your own filter, please take a look at the manual page. Or you can follow the demo code. The new custom filters should be written in C++.
-
To build the source code, you can use the xcode project in the 'library' folder.
Sample Code for doing a filter with UIImage
//Simply apply a filter to an UIImage.
- (void)viewDidLoad
{
UIImage* srcImage = [UIImage imageNamed:@"test.jpg"];
//HSL Adjust (hue: 0.02, saturation: -0.31, luminance: -0.17)
//Please see the manual for more details.
const char* ruleString = @"@adjust hsl 0.02 -0.31 -0.17";
UIImage* resultImage = cgeFilterUIImage_MultipleEffects(srcImage, ruleString, 1.0f, nil);
//Then the dstImage is applied with the filter.
//It's so convenient, isn't it?
}
Your filter must inherit CGEImageFilterInterfaceAbstract or its child class. Most of the filters are inherited from CGEImageFilterInterface because it has many useful functions.
// A simple customized filter to do a color reversal.
class MyCustomFilter : public CGE::CGEImageFilterInterface
{
public:
bool init()
{
CGEConstString fragmentShaderString = CGE_SHADER_STRING_PRECISION_H
(
varying vec2 textureCoordinate; //defined in 'g_vshDefaultWithoutTexCoord'
uniform sampler2D inputImageTexture; // the same to above.
void main()
{
vec4 src = texture2D(inputImageTexture, textureCoordinate);
src.rgb = 1.0 - src.rgb; //Simply reverse all channels.
gl_FragColor = src;
}
);
//m_program is defined in 'CGEImageFilterInterface'
return m_program.initWithShaderStrings(g_vshDefaultWithoutTexCoord, s_fsh);
}
//void render2Texture(CGE::CGEImageHandlerInterface* handler, GLuint srcTexture, GLuint vertexBufferID)
//{
// //Your own render functions here.
// //Do not override this function to use the CGEImageFilterInterface's.
//}
};
Note: To add your own shader filter with c++. Please see the demo for further details.
Please see this: https://github.com/wysaid/ios-gpuimage-plus/blob/master/library/filterLib/cgeCustomFilters.h#L34
En: https://github.com/wysaid/android-gpuimage-plus/wiki/Parsing-String-Rule-En
Ch: https://github.com/wysaid/android-gpuimage-plus/wiki/Parsing-String-Rule
Some utils are available for creating filters: https://github.com/wysaid/cge-tools
Alipay:
Paypal: