Skip to content Skip to sidebar Skip to footer

Get A Vignette Effect By Shaders

Im trying to create a vignette effect for my app. I've been searching a lot for help achieving this but was unable to find anything. I recently found this tutorial. And i tried to

Solution 1:

After long time i found it

public Bitmap vignett(Bitmap bm, int p){
    Bitmap image = Bitmap.createBitmap(bm.getWidth(),bm.getHeight(), Bitmap.Config.ARGB_8888);
    int rad;
    Canvas canvas = new Canvas(image);
    canvas.drawBitmap(bm, 0, 0, new Paint());
    if(bm.getWidth()<bm.getHeight()){
        int o = (bm.getHeight()*2)/100;
        rad = bm.getHeight() - o*p/3;
    }else{
        int o = (bm.getWidth()*2)/100;
        rad = bm.getWidth() - o*p/3;
    }
    Rect rect = new Rect(0, 0, bm.getWidth(), bm.getHeight());
    RectF rectf = new RectF(rect);
    int[] colors = new int[] { 0, 0, Color.BLACK };
    float[] pos = new float[] { 0.0f, 0.1f, 1.0f };
    Shader linGradLR = new RadialGradient(rect.centerX(), rect.centerY(),rad, colors, pos, Shader.TileMode.CLAMP);
    Paint paint = new Paint();
    paint.setShader(linGradLR);
    paint.setAntiAlias(true);
    paint.setDither(true);
    paint.setAlpha(255);
    canvas.drawRect(rectf, paint);
    return image;
}

here int p is standard value of seekbar from 1 to 100; for intensity of effect u can set paint.setAlpha 0 to 255!!!


Solution 2:

My first answer got deleted because i pointed to my solution via link. So I'll answer your question right here. The trick is to use 4 linear gradients. Applying them will give you a result that comes pretty close to a true Vignette effect. And it's freaking fast too ;) So here's part of my solution. First you must create a canvas:

    Canvas canvas = new Canvas(bitmapOut);
    canvas.drawBitmap(mVignette.getBitmapIn(), 0, 0, null);

Then you define how far the effect should reach into your image:

    int tenthLeftRight = (int)(width/5);
    int tenthTopBottom = (int)(height/5);

Now you create your four shaders:

    // Gradient left - right
    Shader linGradLR = new LinearGradient(0, height/2, tenthLeftRight/2, height/2, Color.BLACK, Color.TRANSPARENT, Shader.TileMode.CLAMP);
    // Gradient top - bottom
    Shader linGradTB = new LinearGradient(width/2, 0, width/2, tenthTopBottom, Color.BLACK, Color.TRANSPARENT, Shader.TileMode.CLAMP);
    // Gradient right - left
    Shader linGradRL = new LinearGradient(width, height/2, (width-tenthLeftRight), height/2, Color.BLACK, Color.TRANSPARENT, Shader.TileMode.CLAMP);
    // Gradient bottom - top
    Shader linGradBT = new LinearGradient(width/2, height, width/2, (height - tenthTopBottom), Color.BLACK, Color.TRANSPARENT, Shader.TileMode.CLAMP); 

Now all that's left to do is to draw on the canvas:

    Paint paint = new Paint();
    paint.setShader(linGradLR);
    paint.setAntiAlias(true);
    paint.setDither(true);
    paint.setAlpha(125);
    // Rect for Grad left - right
    Rect rect = new Rect(0, 0, tenthLeftRight, height);
    RectF rectf = new RectF(rect);
    canvas.drawRect(rectf, paint);

    // Rect for Grad top - bottom
    paint.setShader(linGradTB);
    rect = new Rect(0, 0, width, tenthTopBottom);
    rectf = new RectF(rect);
    canvas.drawRect(rectf, paint);

    // Rect for Grad right - left
    paint.setShader(linGradRL);
    rect = new Rect(width, 0, width - tenthLeftRight, height);
    rectf = new RectF(rect);
    canvas.drawRect(rectf, paint);

    // Rect for Grad bottom - top
    paint.setShader(linGradBT);
    rect = new Rect(0, height - tenthTopBottom, width, height);
    rectf = new RectF(rect);
    canvas.drawRect(rectf, paint);

Post a Comment for "Get A Vignette Effect By Shaders"