如何在Android中模糊背景图像

时间:2015-07-26 21:08:26

标签: java android

模糊背景图片的最佳方法是什么,如下图所示?我看到了一些代码和库,但它们已经有几年的历史了,或者像BlurBehind库一样,但它没有给出相同的效果。提前谢谢!

enter image description here

12 个答案:

答案 0 :(得分:34)

最简单的方法是使用库。看一下这个:https://github.com/wasabeef/Blurry

使用库只需要执行此操作:

Blurry.with(context)
  .radius(10)
  .sampling(8)
  .color(Color.argb(66, 255, 255, 0))
  .async()
  .onto(rootView);

答案 1 :(得分:13)

这是使用我在此article

上找到的Android的RenderScript有效模糊图像的简便方法
  1. 创建一个名为BlurBuilder的类

    public class BlurBuilder {
      private static final float BITMAP_SCALE = 0.4f;
      private static final float BLUR_RADIUS = 7.5f;
    
      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 rs = RenderScript.create(context);
        ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
        Allocation tmpIn = Allocation.createFromBitmap(rs, inputBitmap);
        Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap);
        theIntrinsic.setRadius(BLUR_RADIUS);
        theIntrinsic.setInput(tmpIn);
        theIntrinsic.forEach(tmpOut);
        tmpOut.copyTo(outputBitmap);
    
        return outputBitmap;
      }
    }
    
  2. 将任何图像复制到可绘制文件夹

  3. 在您的活动中使用BlurBuilder:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_login);
    
        mContainerView = (LinearLayout) findViewById(R.id.container);
        Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.background);
        Bitmap blurredBitmap = BlurBuilder.blur( this, originalBitmap );
        mContainerView.setBackground(new BitmapDrawable(getResources(), blurredBitmap));
    
  4. Renderscript包含在支持v8中,可以将此答案缩小到api 8.要使用gradle启用它,请将这些行包含在您的gradle文件中(来自此answer

    defaultConfig {
        ...
        renderscriptTargetApi *your target api*
        renderscriptSupportModeEnabled true
    }
    
  5. 结果

  6. enter image description here

答案 2 :(得分:5)

您可以使用

    Glide.with(getContext()).load(R.mipmap.bg)
            .apply(bitmapTransform(new BlurTransformation(22)))
            .into((ImageView) view.findViewById(R.id.imBg));

答案 3 :(得分:2)

您可以将背景颜色视为黑色,并将视图的alpha设置为0.7或根据您的要求设置。

{{1}}

答案 4 :(得分:1)

overlay 是一个额外的图层,位于视图顶部("主视图"),该图层是在该视图中的所有其他内容之后绘制的(包括子项,如果视图是ViewGroup)。通过添加和移除drawable来完成与覆盖层的交互。 试试这个,Overlay with User Instructions

答案 5 :(得分:1)

实现这一目标的最简单方法如下,

I)

Glide.with(context.getApplicationContext())
                        .load(Your Path)   
                        .override(15, 15) // (change according to your wish)
                        .error(R.drawable.placeholder)
                        .into(image.score);

否则你可以按照以下代码进行..

II)

1.创建课程。(代码如下)

public class BlurTransformation extends BitmapTransformation {

    private RenderScript rs;

    public BlurTransformation(Context context) {
        super( context );

        rs = RenderScript.create( context );
    }

    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        Bitmap blurredBitmap = toTransform.copy( Bitmap.Config.ARGB_8888, true );

        // Allocate memory for Renderscript to work with
        Allocation input = Allocation.createFromBitmap(
            rs, 
            blurredBitmap, 
            Allocation.MipmapControl.MIPMAP_FULL, 
            Allocation.USAGE_SHARED
        );
        Allocation output = Allocation.createTyped(rs, input.getType());

        // Load up an instance of the specific script that we want to use.
        ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
        script.setInput(input);

        // Set the blur radius
        script.setRadius(10);

        // Start the ScriptIntrinisicBlur
        script.forEach(output);

        // Copy the output to the blurred bitmap
        output.copyTo(blurredBitmap);

        toTransform.recycle();

        return blurredBitmap;
    }

    @Override
    public String getId() {
        return "blur";
    }
}

2.使用Glide将图像设置为ImageView。

例如:

Glide.with(this)
     .load(expertViewDetailsModel.expert.image)
     .asBitmap()
     .transform(new BlurTransformation(this))
     .into(ivBackground);

答案 6 :(得分:0)

这可能不是最有效的解决方案,但我必须使用它,因为wasabeef / Blurry库对我不起作用。如果你想要一些模糊的动画,这可能会很方便:

1-你需要有2个版本的图片,正常版本和模糊的你用photoshop或其他什么

2-在xml中设置彼此适合的图像,然后可以看到其中一个,这是上面的那个

在上面设置3-set fadeout动画:

final Animation fadeOut = new AlphaAnimation(1, 0);
        fadeOut.setInterpolator(new AccelerateInterpolator());
        fadeOut.setDuration(1000);


        fadeOut.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {}

            @Override
            public void onAnimationEnd(Animation animation) {upperone.setVisibility(View.GONE);}

            @Override
            public void onAnimationRepeat(Animation animation) {}
        });

        upperone.startAnimation(fadeOut);

答案 7 :(得分:0)

尝试以下代码.. 将此代码放入On Create ..



 if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy =
                    new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }
       Url="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTIur0ueOsmVmFVmAA-SxcCT7bTodZb3eCNbiShIiP9qWCWk3mDfw";
//        Picasso.with(getContext()).load(Url).into(img_profile);
//        Picasso.with(getContext()).load(Url).into(img_c_profile);

        bitmap=getBitmapFromURL(Url);
        Bitmap blurred = blurRenderScript(bitmap, 12);//second parametre is radius
        img_profile.setImageBitmap(blurred);




创建以下方法..只需复制过去..



 public static Bitmap getBitmapFromURL(String src) {
        try {
            URL url = new URL(src);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap myBitmap = BitmapFactory.decodeStream(input);
            return myBitmap;
        } catch (IOException e) {
            // Log exception
            return null;
        }
    }
    @SuppressLint("NewApi")
    private Bitmap blurRenderScript(Bitmap smallBitmap, int radius) {

        try {
            smallBitmap = RGB565toARGB888(smallBitmap);
        } catch (Exception e) {
            e.printStackTrace();
        }


        Bitmap bitmap = Bitmap.createBitmap(
                smallBitmap.getWidth(), smallBitmap.getHeight(),
                Bitmap.Config.ARGB_8888);

        RenderScript renderScript = RenderScript.create(getActivity());

        Allocation blurInput = Allocation.createFromBitmap(renderScript, smallBitmap);
        Allocation blurOutput = Allocation.createFromBitmap(renderScript, bitmap);

        ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(renderScript,
                Element.U8_4(renderScript));
        blur.setInput(blurInput);
        blur.setRadius(radius); // radius must be 0 < r <= 25
        blur.forEach(blurOutput);

        blurOutput.copyTo(bitmap);
        renderScript.destroy();

        return bitmap;

    }

    private Bitmap RGB565toARGB888(Bitmap img) throws Exception {
        int numPixels = img.getWidth() * img.getHeight();
        int[] pixels = new int[numPixels];

        //Get JPEG pixels.  Each int is the color values for one pixel.
        img.getPixels(pixels, 0, img.getWidth(), 0, 0, img.getWidth(), img.getHeight());

        //Create a Bitmap of the appropriate format.
        Bitmap result = Bitmap.createBitmap(img.getWidth(), img.getHeight(), Bitmap.Config.ARGB_8888);

        //Set RGB pixels.
        result.setPixels(pixels, 0, result.getWidth(), 0, 0, result.getWidth(), result.getHeight());
        return result;
    }
&#13;
&#13;
&#13;

答案 8 :(得分:0)

通过执行以下操作,您可以快速获得模糊效果。

///将其添加到build.gradle应用程序//

Compile ' com.github.jgabrielfreitas:BlurImageView:1.0.1 '

//添加到XML

<com.jgbrielfreitas.core.BlurImageView
    android:id="@+id/iv_blur_image"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
/>

//将此添加到Java

Import com.jgabrielfreitas.core.BlueImageView;

//在公共类别下*活动名称* //

BlurImageView myBlurImage;

//在Oncreate //

myBlurImage = (ImageView) findViewById(R.id.iv_blur_image)
MyBlurImage.setBlue(5)

我希望能对某人有所帮助

答案 9 :(得分:0)

您可以使用Glide进行加载并转换为模糊图像, 1)仅用于一个视图,

val requestOptions = RequestOptions()
                requestOptions.transform(BlurTransformation(50)) // 0-100
Glide.with(applicationContext).setDefaultRequestOptions(requestOptions)
                        .load(imageUrl).into(view)

2)如果您正在使用适配器在项目中加载图像,则应在if-else块中编写代码,否则,它将使所有图像变得模糊。

 if(isBlure){
  val requestOptions = RequestOptions()
                requestOptions.transform(BlurTransformation(50))
                Glide.with(applicationContext).setDefaultRequestOptions(requestOptions)
                        .load(imageUrl).into(view )
}else{
 val requestOptions = RequestOptions()
            Glide.with(applicationContext).setDefaultRequestOptions(requestOptions).load(imageUrl).into(view)
}

答案 10 :(得分:0)

Android 12, Preview 1 带有内置模糊功能。我们现在不需要依赖外部库。这是代码

imageView.setRenderEffect(
        RenderEffect.createBlurEffect(
            20.0f, 20.0f, SHADER_TITLE_MODE
        )
)

答案 11 :(得分:-2)

这可能是一个非常晚的回复,但我希望它有助于某人。

  1. 您可以使用第三方库,例如RenderScript / Blurry /等。
  2. 如果您不想使用任何第三方库,您可以使用alpha进行以下操作(将alpha设置为0表示完全模糊,1表示与现有图像相同)。
  3. 注意(如果您使用的是第2点):将alpha设置为背景时,会模糊整个布局。为了避免这种情况,创建一个包含drawable的新xml,并将alpha设置为0.5(或您的愿望值),并使用此drawable名称(文件名)作为背景。

    例如,使用如下(例如文件名是bgndblur.xml):

    <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:shape="rectangle"
    android:src="@drawable/registerscreenbackground" 
    android:alpha="0.5">
    

    在布局中使用以下内容:

    <....
     android:background="@drawable/bgndblur">
    

    希望这会有所帮助。