java - 通过着色器获得晕影效果

标签 java android image-processing bitmap shader

我正在尝试为我的应用程序创建晕影效果。我一直在寻找很多帮助来实现这一目标,但一无所获。

我最近发现this tutorial .

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

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/

我做错了什么?

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

谢谢!

最佳答案

找了好久才找到

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

这里int p是seekbar的标准值,从1到100; 对于效果强度,您可以将 Paint.setAlpha 设置为 0 到 255!!!

关于java - 通过着色器获得晕影效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18075141/

相关文章:

java - 如何插入select group by查询生成的多条记录

java - 在 Intellij 中找不到 Servlet

java - 尝试在 Android 上扩展和使用 Activity 时出错

基于像素模式识别的自动化Java框架

algorithm - 地平线检测算法

opencv - SIFT openCV 的关键点数量?

Java生成的图像不能在生成它们的代码中使用吗?

java.lang.IllegalStateException : Connection pool shut down

android - 从安卓图库中选择缩略图

java - 进度条增量