NativeGPUImage for Android

最近在android直播工程中想要加入滤镜处理,有试过opencv但是使用opencv进行图像处理对cpu造成了很大的压力,以至于礼物动效UI都出现了卡顿。因为需要实时对摄像头采集的数据进行滤镜渲染,最终放弃了opencv的想法改而使用以GPU处理图像的高性能特效gpu-image framework。目前gpuiamge库在android版本中只有java版本,所以本工程是对android-gpuimage的native重写,尽可能的实现android-gpuimage和gpuimage中的特性。

capture1.gif

capture2.gif

capture4.gif

How do I use NGP?

将渲染结果显示在ImageView中.

0b269e67e148813437c046e2e56eacdd.png

NGP.with(this)

.applyBitmapByUrls("http://www.zhangchuany.com/photo5.jpg")

.applyFilter(new GPUImageSaturationFilter(2.0f)) //设置默认Filter

.applyWidth(1000) //指定宽度渲染,不指定宽度则按原图宽度渲染

.applyHeight(1000) //指定高度渲染,不指定高度则按原图高度渲染

.applyRotation(Rotation.ROTATION_90) //旋转90度进行渲染

.applyScaleType(ScaleType.CENTER_CROP) //默认 ScaleType.CENTER_INSIDE

.autoFile(false) //是否将渲染结果保存至磁盘,默认true,设置false将大幅提升NGP响应效率

.build()

.into(mImageView)

如何进行批量FBO渲染

List results = NGP.with(this)

.applyBitmapByUrls(

"http://www.zhangchuany.com/photo1.jpg",

"http://www.zhangchuany.com/photo2.jpg",

"http://www.zhangchuany.com/photo3.jpg",

"http://www.zhangchuany.com/photo4.jpg",

"http://www.zhangchuany.com/photo5.jpg"

)

.applyBitmaps(

R.drawable.photo1,

R.drawable.photo2,

R.drawable.photo3,

R.drawable.photo4,

R.drawable.photo5

)

.applyFilter(new GPUImageSaturationFilter(2.0f)) //设置默认Filter

.applyWidth(1000) //指定宽度渲染,不指定宽度则按原图宽度渲染

.applyHeight(1000) //指定高度渲染,不指定高度则按原图高度渲染

.applyRotation(Rotation.ROTATION_90) //旋转90度进行渲染

.applyScaleType(ScaleType.CENTER_CROP) //默认 ScaleType.CENTER_INSIDE

.applyNGPFilter(new NGPFilterListener() { //设置过滤器,当批量渲染时(非MultipleFilter)

@Override

public Render.UpgradRender apply(Render.UpgradRender render, int position) {

//针对批量处理单独设置filter

render.setFilter(filters.get(position));

return render;

}

})

.build()

.get(); //同步处理

Camera实时预览

使用NGPNativeBridge.nativeApplyYUV420(data, width, height)将YUV数据发送至Native进行实时渲染,使用该函数后不需要手动调用NGPNativeBridge.nativeRequestRender()函数。详情见 CameraDemo

android:id="@+id/mSurfaceView"

android:layout_width="match_parent"

android:layout_height="match_parent"/>

mSurfaceView.initialize({

//初始化滤镜

NGPNativeBridge.nativeApplyFilter(GPUImageGrayscaleFilter())

//设置旋转角度

NGPNativeBridge.nativeApplyRotation(Rotation.getValue(getRotation(cameraLoader.getCameraOrientation())), false, false)

})

//通过NGPNativeBridge将预览数据发送至Native

NGPNativeBridge.nativeApplyYUV420(data, width, height)

根据特定场景自定义渲染流程

NGP的渲染是在Native中进行的,与Native的交互都被封装在NGPNativeBridge中,只需要遵循NGPNative生命周期就可以自定义渲染.

FBO离屏渲染:

1、NGPNativeBridge.init(); //只需执行一次,目的是需要在Native中注册相关Class

2、NGPNativeBridge.nativeCreateGL(); //同一个渲染流程只需要创建一次GL

3、NGPNativeBridge.nativeSurfaceChanged(int width, int height); //当Bitmap宽高发生变化时调用,可以被重复调用

4、NGPNativeBridge.nativeApplyFilter(NativeFilter f); //设置一个Filter,可以被重复调用

5、NGPNativeBridge.nativeApplyBitmap(Bitmap bitmap); //设置一个Bitmap,还未进行渲染

NGPNativeBridge.nativeApplyYUV420(byte[] yuv);

6、NGPNativeBridge.nativeCapture(Bitmap bitmap); //获取渲染后的Bitmap,渲染.

7、NGPNativeBridge.nativeDestroyed(); //渲染结束后调用释放资源

Surface渲染:

1、NGPNativeBridge.init();

2、NGPNativeBridge.nativeSurfaceCreated(Surface surface);

3、NGPNativeBridge.nativeSurfaceChanged(int width, int height);

4、NGPNativeBridge.nativeApplyFilter(NativeFilter f);

5、NGPNativeBridge.nativeApplyBitmap(Bitmap bitmap);

NGPNativeBridge.nativeApplyYUV420(byte[] yuv);

6、NGPNativeBridge.nativeRequestRender();

7、NGPNativeBridge.nativeDestorySurfaceGL();

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

License

Copyright 2019 ben622, 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.

更多推荐