一.背景
前段时间项目中新增了需求,要在一个动态的背景(比如聊天或者弹幕)上显示一个View,显示的过程中要求对背景进行模糊效果,且保持背景的动态性,即实现一个实时性的模糊效果(实时地对聊天或者弹幕内容进行模糊)。在思考在Android中如何实现这种效果之前,首先应该了解,一张图片从清晰到模糊这个过程是如何转变的。
二.模糊
(1)图像矩阵
通常我们所说的图像其实是由一个个像素方块组成,每个像素方块都有一个对应的彩色数值,所有的像素方块都表现出自己的对应的颜色时,具体的图像就展示出来了。
在计算机中,图像中每个像素方块的彩色数值的保存通常是以数组或者矩阵的形式保存的,矩阵中的每个元素就是对应的ARGB值,因此很多关于图像的处理实际上都是对图像矩阵的处理,通过改变图像矩阵中的值从而改变图像的显示。假设一张有9个像素点的红色图片, 如下:在Android中可以通过Bitmap获取到对应的像素点的像素,举个例子,有这么一个drawable:
通过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
<