package com.yydcdut.note.utils;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import java.lang.ref.WeakReference;
import rx.Observable;
import rx.schedulers.Schedulers;
/**
* Created by yuyidong on 16/1/11.
*/
public class RxImageBlur {
private WeakReference<Context> mContextWeakReference;
private static RxImageBlur mRxImageBlur;
private int mRadius = 2;
static {
System.loadLibrary("blur");
}
private native void blur(Bitmap bitmap, int r);
public RxImageBlur(Context context) {
mContextWeakReference = new WeakReference<>(context);
}
public static RxImageBlur with(Context context) {
mRxImageBlur = new RxImageBlur(context);
return mRxImageBlur;
}
public RxImageBlur radius(int radius) {
mRadius = radius;
return this;
}
public Observable<Drawable> blur(Bitmap bitmap) {
return Observable.just(bitmap)
.subscribeOn(Schedulers.computation())
.filter(bitmap3 -> mContextWeakReference.get() != null)
.filter(bitmap4 -> bitmap4 != null)
.map(bitmap1 -> getOverlay(bitmap1))
.map(bitmap2 -> new BitmapDrawable(mContextWeakReference.get().getResources(), bitmap2));
}
private Bitmap getOverlay(Bitmap bitmap) {
float scaleFactor = 8;
Bitmap overlay = Bitmap.createBitmap((int) (bitmap.getWidth() / scaleFactor),
(int) (bitmap.getHeight() / scaleFactor), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(overlay);
canvas.scale(1 / scaleFactor, 1 / scaleFactor);
Paint paint = new Paint();
paint.setFlags(Paint.FILTER_BITMAP_FLAG);
canvas.drawBitmap(bitmap, 0, 0, paint);
blur(overlay, mRadius);
return overlay;
}
}