package com.marshalchen.common.demoofui.imageprocessingexample; import java.util.ArrayList; import java.util.List; import com.marshalchen.common.demoofui.R; import com.marshalchen.common.uimodule.imageprocessing.FastImageProcessingPipeline; import com.marshalchen.common.uimodule.imageprocessing.FastImageProcessingView; import com.marshalchen.common.uimodule.imageprocessing.filter.BasicFilter; import com.marshalchen.common.uimodule.imageprocessing.filter.colour.*; import com.marshalchen.common.uimodule.imageprocessing.filter.effect.*; import com.marshalchen.common.uimodule.imageprocessing.filter.processing.*; import com.marshalchen.common.uimodule.imageprocessing.input.CameraPreviewInput; import com.marshalchen.common.uimodule.imageprocessing.input.GLTextureOutputRenderer; import com.marshalchen.common.uimodule.imageprocessing.input.ImageResourceInput; import com.marshalchen.common.uimodule.imageprocessing.outputs.ScreenEndpoint; import android.app.Activity; import android.content.Context; import android.graphics.Point; import android.graphics.PointF; import android.os.Build; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.Toast; public class ImageProcessingActivity extends Activity { private FastImageProcessingView view; private List<BasicFilter> filters; private int curFilter; private GLTextureOutputRenderer input; private long touchTime; private FastImageProcessingPipeline pipeline; private ScreenEndpoint screen; private boolean usingCamera; private void addFilter(BasicFilter filter) { filters.add(filter); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); view = new FastImageProcessingView(this); pipeline = new FastImageProcessingPipeline(); view.setPipeline(pipeline); setContentView(view); usingCamera = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH); usingCamera = false; if (usingCamera) { input = new CameraPreviewInput(view); } else { input = new ImageResourceInput(view, this, R.drawable.image_processing_kukulkan); } filters = new ArrayList<BasicFilter>(); addFilter(new FlipFilter(FlipFilter.FLIP_HORIZONTAL)); addFilter(new MosaicFilter(this, R.drawable.image_processing_webcircles, new PointF(0.125f, 0.125f), new PointF(0.025f, 0.025f), 64, true)); addFilter(new CGAColourSpaceFilter()); addFilter(new KuwaharaRadius3Filter()); //addFilter(new KuwaharaFilter(8)); //Will not work on devices that don't support for loop on shader addFilter(new VignetteFilter(new PointF(0.5f, 0.5f), new float[] {0.3f, 0.8f, 0.3f}, 0.3f, 0.75f)); addFilter(new GlassSphereFilter(new PointF(0.43f, 0.5f), 0.25f, 0.71f, 0.5f)); addFilter(new SphereRefractionFilter(new PointF(0.43f, 0.5f), 0.25f, 0.71f, 0.5f)); addFilter(new StretchDistortionFilter(new PointF(0.5f, 0.5f))); addFilter(new PinchDistortionFilter(new PointF(0.43f, 0.5f), 0.25f, 0.5f, 0.5f)); addFilter(new BulgeDistortionFilter(new PointF(0.43f, 0.5f), 0.25f, 0.5f, 0.5f)); addFilter(new SwirlFilter(new PointF(0.4f, 0.5f), 0.5f, 1f)); addFilter(new PosterizeFilter(2f)); addFilter(new EmbossFilter(1.5f)); addFilter(new SmoothToonFilter(0.25f, 0.5f, 5f)); addFilter(new ToonFilter(0.4f, 10f)); addFilter(new ThresholdSketchFilter(0.7f)); addFilter(new SketchFilter()); addFilter(new CrosshatchFilter(0.005f, 0.0025f)); addFilter(new HalftoneFilter(0.01f, 1f)); addFilter(new PolkaDotFilter(0.9f, 0.03f, 1f)); addFilter(new PolarPixellateFilter(new PointF(0.4f, 0.5f), new PointF(0.05f, 0.05f))); addFilter(new PixellateFilter(0.01f, 1f)); addFilter(new ZoomBlurFilter(2f, new PointF(0.4f, 0.5f))); addFilter(new MotionBlurFilter(2f, 45f)); addFilter(new OpeningFilter(1)); addFilter(new OpeningRGBFilter(3)); addFilter(new ClosingFilter(2)); addFilter(new ClosingRGBFilter(4)); addFilter(new ErosionRGBFilter(3)); addFilter(new ErosionFilter(1)); addFilter(new DilationRGBFilter(2)); addFilter(new DilationFilter(4)); addFilter(new CannyEdgeDetectionFilter(1.0f, 0.1f, 0.4f)); addFilter(new ThresholdEdgeDetectionFilter(0.6f)); addFilter(new SobelEdgeDetectionFilter()); addFilter(new TiltShiftFilter(4f, 0.4f, 0.6f, 0.2f)); addFilter(new BilateralBlurFilter(1f)); addFilter(new MedianFilter()); addFilter(new GaussianBlurPositionFilter(4f, 1.2f, new PointF(0.4f,0.5f), 0.5f, 0.1f)); addFilter(new GaussianSelectiveBlurFilter(4f, 1.2f, new PointF(0.4f,0.5f), 0.5f, 0.1f)); addFilter(new SingleComponentGaussianBlurFilter(2.3f)); addFilter(new SingleComponentFastBlurFilter()); addFilter(new FastBlurFilter()); addFilter(new UnsharpMaskFilter(2.0f, 0.5f)); addFilter(new SharpenFilter(1f)); //addFilter(new LanczosResamplingFilter(256, 128)); addFilter(new CropFilter(0.25f,0f,0.75f,1f)); BasicFilter cFilter1 = new CropFilter(0.25f,0f,0.75f,1f); cFilter1.rotateClockwise90Degrees(1); addFilter(cFilter1); BasicFilter cFilter2 = new CropFilter(0.25f,0f,0.75f,1f); cFilter2.rotateClockwise90Degrees(2); addFilter(cFilter2); BasicFilter cFilter3 = new CropFilter(0.25f,0f,0.75f,1f); cFilter3.rotateClockwise90Degrees(3); addFilter(cFilter3); addFilter(new TransformFilter(new float[] { 1f, 0f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 1f, 0f, -0.5f, 0f, 0f, 1f }, false, false)); addFilter(new ChromaKeyFilter(new float[] {1.0f, 0.3f, 0.0f}, 0.4f, 0.1f)); addFilter(new AdaptiveThresholdFilter()); addFilter(new BoxBlurFilter()); addFilter(new LuminanceThresholdFilter(0.4f)); addFilter(new OpacityFilter(0.5f)); addFilter(new SepiaFilter()); addFilter(new HazeFilter(0.3f,0.1f)); addFilter(new FalseColourFilter(new float[]{0.0f,0.0f,0.5f}, new float[]{1.0f,0.0f,0.0f})); addFilter(new MonochromeFilter(new float[]{1.0f,0.8f,0.8f}, 1.0f)); addFilter(new ColourInvertFilter()); addFilter(new SoftEleganceFilter(this)); addFilter(new GaussianBlurFilter(2.3f)); addFilter(new MissEtikateFilter(this)); addFilter(new AmatorkaFilter(this)); addFilter(new LookupFilter(this, R.drawable.image_processing_lookup_soft_elegance_1)); addFilter(new HighlightShadowFilter(0f, 1f)); Point[] defaultCurve = new Point[] {new Point(128,128), new Point(64,0), new Point(192,255)}; addFilter(new ToneCurveFilter(defaultCurve,defaultCurve,defaultCurve,defaultCurve)); addFilter(new HueFilter(3.14f/6f)); addFilter(new BrightnessFilter(0.5f)); addFilter(new ColourMatrixFilter(new float[]{ 0.33f,0f,0f,0f, 0f,0.67f,0f,0f, 0f,0f,1.34f,0f, 0.2f,0.2f,0.2f,1.0f}, 0.5f)); addFilter(new RGBFilter(0.33f,0.67f,1.34f)); addFilter(new GreyScaleFilter()); addFilter(new ConvolutionFilter(new float[] { 1/25f,1/25f,1/25f,1/25f,1/25f, 1/25f,1/25f,1/25f,1/25f,1/25f, 1/25f,1/25f,1/25f,1/25f,1/25f, 1/25f,1/25f,1/25f,1/25f,1/25f, 1/25f,1/25f,1/25f,1/25f,1/25f}, 5, 5)); addFilter(new ExposureFilter(0.95f)); addFilter(new ContrastFilter(1.5f)); addFilter(new SaturationFilter(0.5f)); addFilter(new GammaFilter(1.75f)); addFilter(new LevelsFilter(0.2f,0.8f,1f,0f,1f)); screen = new ScreenEndpoint(pipeline); input.addTarget(screen); for(BasicFilter filter : filters) { filter.addTarget(screen); } pipeline.addRootRenderer(input); pipeline.startRendering(); final Context context = this; view.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent e) { if(System.currentTimeMillis() - touchTime > 100) { pipeline.pauseRendering(); touchTime = System.currentTimeMillis(); if(curFilter == 0) { input.removeTarget(screen); } else { input.removeTarget(filters.get(curFilter-1)); pipeline.addFilterToDestroy(filters.get(curFilter-1)); } curFilter=(curFilter+1)%(filters.size()+1); if(curFilter == 0) { input.addTarget(screen); } else { input.addTarget(filters.get(curFilter-1)); Toast.makeText(context, filters.get(curFilter-1).getClass().getSimpleName(), Toast.LENGTH_SHORT).show(); } pipeline.startRendering(); view.requestRender(); } return false; } }); Toast.makeText(this, "Tap the screen to change filter.", Toast.LENGTH_LONG).show(); } @Override public void onPause() { super.onPause(); if (usingCamera) { ((CameraPreviewInput) input).onPause(); } } @Override public void onResume() { super.onResume(); if (usingCamera) { ((CameraPreviewInput) input).onResume(); } } }