RenderScript:简单实现动态模糊效果
2018-01-02 14:31
465 查看
见过很多毛玻璃的效果,当然也有很多实现毛玻璃效果的方法,这是写的一个毛玻璃效果的小例子,简单记录下
效果图:
思路:
动态设置模糊效果,可以看成是两张图片的叠加,通过设置其中一张图片的透明度,从而实现动态模糊的效果Step1:
在Build.gradle中加上defaultConfig { ... renderscriptTargetApi 19 renderscriptSupportModeEnabled true ... }
Step2:
利用RenderScript实现模糊的核心类public class BlurBitmap { /** * 图片缩放比例 */ private static final float BITMAP_SCALE = 0.4f; /** * 最大模糊度(在0.0到25.0之间) */ private static final float BLUR_RADIUS = 25f; /** * 模糊图片的具体方法 * * @param context 上下文对象 * @param image 需要模糊的图片 * @return outputBitmap 模糊处理后的图片 */ public static Bitmap blur(Context context, Bitmap image) { // 计算图片缩小后的长宽 int width = Math.round(image.getWidth() * BITMAP_SCALE); int height = Math.round(image.getHeight() * BITMAP_SCALE); // 将缩小后的图片做为预渲染的图片。 Bitmap inputBitmap = Bitmap.createScaledBitmap(image, width, height, false); // 创建一张渲染后的输出图片。 Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap); // 创建RenderScript内核对象 RenderScript rs = RenderScript.create(context); // 创建一个模糊效果的RenderScript的工具对象 ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); // 由于RenderScript并没有使用VM来分配内存,所以需要使用Allocation类来创建和分配内存空间。 // 创建Allocation对象的时候其实内存是空的,需要使用copyTo()将数据填充进去。 Allocation tmpIn = Allocation.createFromBitmap(rs, inputBitmap); Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap); // 设置渲染的模糊程度, 25f是最大模糊度 blurScript.setRadius(BLUR_RADIUS); // 设置blurScript对象的输入内存 blurScript.setInput(tmpIn); // 将输出数据保存到输出内存中 blurScript.forEach(tmpOut); // 将数据填充到Allocation中 tmpOut.copyTo(outputBitmap); return outputBitmap; } }
Step3:
调整图片的透明度,实现动态模糊的效果public class MainActivity extends AppCompatActivity { private SeekBar mSbSeekbar; private ImageView mIvOriginImg; private ImageView mIvBlurImg; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); setSeekBar(); } private void setSeekBar() { mSbSeekbar.setMax(100); mSbSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { mIvBlurImg.setAlpha((int) (255 - progress * 2.55)); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); } private void initView() { //初始化图片 Bitmap bmp= BitmapFactory.decodeResource(getResources(), R.drawable.timg); mIvOriginImg = (ImageView) findViewById(R.id.iv_origin_img); mIvBlurImg = (ImageView) findViewById(R.id.iv_blur_img); mSbSeekbar = (SeekBar) findViewById(R.id.sb_seekbar); mIvOriginImg.setImageBitmap(bmp); mIvBlurImg.setImageBitmap(BlurBitmap.blur(getApplicationContext(), bmp)); } }
效果图:
相关文章推荐
- RenderScript----Android图片模糊效果的简单实现
- SVG 实现动态模糊动画效果
- 教你一分钟实现动态模糊效果
- Android:用RenderScript实现模糊效果
- Android模糊处理简单实现毛玻璃效果
- 企业网站展示补充用Jquery实现简单的动态变化效果
- 用简单的方法实现Bingo随机出号动态效果
- 高斯模糊效果的简单实现
- Android数字动态显示,仿支付宝app效果简单的实现。字数从0-x!!!
- [FLASH] 实现酷炫动态模糊效果(图)
- Java之简单的图片动态显示(实现类似GIF动画效果)
- 动态实现图片模糊效果
- 教你一分钟实现动态模糊效果
- jQuery+canvas实现简单的球体斜抛及颜色动态变换效果
- 简单的jQuery拖拽排序效果的实现(增强动态)
- Android RenderScript 简单高效实现图片的高斯模糊效果
- Android 实现模糊半透明效果的简单实现
- Android数字动态显示,仿支付宝app效果简单的实现。字数从0-x!!!
- 第五天,终于实现了水下模糊效果(动态挂载脚本),blur里写入shader
- 教你一分钟实现动态模糊效果