通过着色器获得晕影效果 [英] Get a vignette effect by shaders

查看:59
本文介绍了通过着色器获得晕影效果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试为我的应用创建晕影效果.我一直在寻找帮助实现此目标的方法,但找不到任何东西.

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.

我最近找到了本教程.

我尝试使用以下代码在我的应用程序中实现它:

And i tried to implement it in my app with this code:

public int[] drawBitmap(Bitmap originalBitmap){
    Bitmap mask;
    Paint paint = new Paint();
    mask = convertToAlphaMask(BitmapFactory.decodeResource(context.getResources(), R.drawable.spot_mask));
    Shader shader = createShader(mask);
    paint.setShader(shader);

    Bitmap tempBit = Bitmap.createBitmap(mask.getWidth(), mask.getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(tempBit);
    canvas.drawBitmap(originalBitmap, 0, 0,paint);
    tempBit.getPixels(pixels, 0, tempBit.getWidth(), 0, 0, tempBit.getWidth(), tempBit.getHeight());
    return pixels;
}
private static Bitmap convertToAlphaMask(Bitmap input) {
    Bitmap a = Bitmap.createBitmap(input.getWidth(), input.getHeight(), Bitmap.Config.ALPHA_8);
    Canvas c = new Canvas(a);
    c.drawBitmap(input, 0.0f, 0.0f, null);
    return a;
}
private static Shader createShader(Bitmap b) {
    return new BitmapShader(b, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
}

但是这样做的效果是这样的:(唯一的变化是在图像的顶部) http://postimg.org/image/rrivq28v1/

But the effect of this looks like this:(the only change is at the top of the image) http://postimg.org/image/rrivq28v1/

我做错了什么?

还有,还有其他方法可以在位图上应用晕影效果吗?

Also, are there any other alternatives for applying a vignette effect on a bitmap?

谢谢!

推荐答案

我的第一个答案被删除了,因为我通过链接指向了我的解决方案.因此,我将在这里回答您的问题.诀窍是使用4个线性渐变.应用它们将为您提供非常接近真正的小插图效果的结果.而且它也吓得快;)所以这是我的解决方案的一部分.首先,您必须创建一个画布:

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);

现在创建四个着色器:

    // 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);

这篇关于通过着色器获得晕影效果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆