android studio背景模糊_Android如何实现实时高斯模糊毛玻璃效果

本文介绍了在Android中实现实时高斯模糊效果的方法,包括图像矩阵、卷积计算、高斯滤波的原理,以及如何利用RenderScript进行模糊计算。通过监听View绘制,获取Bitmap进行模糊处理后再显示,实现动态模糊背景。
摘要由CSDN通过智能技术生成

一.背景

前段时间项目中新增了需求,要在一个动态的背景(比如聊天或者弹幕)上显示一个View,显示的过程中要求对背景进行模糊效果,且保持背景的动态性,即实现一个实时性的模糊效果(实时地对聊天或者弹幕内容进行模糊)。在思考在Android中如何实现这种效果之前,首先应该了解,一张图片从清晰到模糊这个过程是如何转变的。

二.模糊

(1)图像矩阵

通常我们所说的图像其实是由一个个像素方块组成,每个像素方块都有一个对应的彩色数值,所有的像素方块都表现出自己的对应的颜色时,具体的图像就展示出来了。

在计算机中,图像中每个像素方块的彩色数值的保存通常是以数组或者矩阵的形式保存的,矩阵中的每个元素就是对应的ARGB值,因此很多关于图像的处理实际上都是对图像矩阵的处理,通过改变图像矩阵中的值从而改变图像的显示。假设一张有9个像素点的红色图片, 如下: 34df7d940d817479e75706d94d0de7e0.png

在Android中可以通过Bitmap获取到对应的像素点的像素,举个例子,有这么一个drawable:

ff2d62176d4a8d59f35cd7f06d5ec822.png

通过Bitmap就可以获取图像矩阵每个元素的ARGB值,这里取(2,2)和中心点,预期应该一个是FF00AAF7(蓝色),一个应该是FFF74131(红色)。

public class MainActivity extends AppCompatActivity {

private TextView mRect;

private static final String TAG = "MainActivity";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_rect);

mRect = findViewById(R.id.rect_view);

Drawable drawable = mRect.getBackground();

Bitmap bitmap = drawableToBitmap(drawable);

int cX = bitmap.getWidth()/2;

int cY = bitmap.getHeight()/2;

int pixel = bitmap.getPixel(2, 2);// ARGB

int red = Color.red(pixel);

int green = Color.green(pixel);

int blue = Color.blue(pixel);

int alpha = Color.alpha(pixel);

Log.e(TAG, "\nA:"+Integer.toHexString(alpha) + "\nR:"+Integer.toHexString(red)

+"\nG:"+ Integer.toHexString(green) + "\nB:"+Integer.toHexString(blue));

pixel = bitmap.getPixel(cX, cY);// ARGB

red = Color.red(pixel);

green = Color.green(pixel);

blue = Color.blue(pixel);

alpha = Color.alpha(pixel);

Log.e(TAG, "\nA:"+Integer.toHexString(alpha) + "\nR:"+Integer.toHexString(red)

+"\nG:"+ Integer.toHexString(green) + "\nB:"+Integer.toHexString(blue));

}

public Bitmap drawableToBitmap(Drawable drawable) {

Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(),

drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);

Canvas canvas = new Canvas(bitmap);

drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

drawable.draw(canvas);

return bitmap;

}

结果为:

  A:ff

<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值