Android: размытое изображение только с левой стороны - PullRequest
0 голосов
/ 21 октября 2019

Я хочу применить эффект размытия к фоновому изображению в моем приложении. Я перепробовал множество решений и трюков, доступных в сети, но они только размывают все изображение, но мое требование - размыть только слева и снизу, есть ли способ сделать это. Любая помощь будет высоко оценена.

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sample);

    LinearLayout blurimage = (LinearLayout) findViewById(R.id.bg);
    Bitmap blurimages = BlurImage(((BitmapDrawable) getResources().getDrawable(R.drawable.default_background)).getBitmap());
    blurimage.setBackground(new BitmapDrawable(blurimages));
}

@SuppressLint({"NewApi", "NewApi", "NewApi", "NewApi", "NewApi", "NewApi", "NewApi"})
public Bitmap BlurImage(Bitmap input) {
    RenderScript rsScript = RenderScript.create(SampleActivity.this);
    Allocation alloc = Allocation.createFromBitmap(rsScript, input);
    ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rsScript, Element.U8_4(rsScript));
    blur.setRadius(10);
    blur.setInput(alloc);

    Bitmap result = Bitmap.createBitmap(input.getWidth(), input.getHeight(), input.getConfig());
    Allocation outAlloc = Allocation.createFromBitmap(rsScript, result);
    blur.forEach(outAlloc);
    outAlloc.copyTo(result);

    rsScript.destroy();
    return result;
}

1 Ответ

1 голос
/ 21 октября 2019

Если вы хотите размыть какую-то часть изображения, вам нужно вырезать эту часть, прежде чем подавать ее в ваш алгоритм размытия.

Вы можете получить Canvas из bitmap, как это. bitmap должно быть mutable.

Canvas canvas = new Canvas(bitmap name);

Чтобы вырезать часть bitmap, нам нужен Rect для указания подмножества, в котором мы заинтересованы, назовем его srcRect. Нам нужен еще один Rect, в котором наше оригинальное растровое изображение будет масштабировано, чтобы соответствовать, давайте назовем это destRect.

Объявите размеры вашего растрового растрового изображения

 int blurBitmapWidth = 50;
 int blurBitmapHeight = 50;

Объявите свои прямоугольники

 Bitmap original = decode form resources....
 Rect srcRect = new Rect(0, original.getHeight() - blurBitmapHeight, blurBitmapWidth, original.getHeight());  // bottom left portion
 Rect destRect = new Rect(0, 0, blurBitmapWidth, blurBitmapHeight);
 Bitmap croppedBitmap = cutBitmap(original, srcRect, destRect);

Метод CutBitmap

private Bitmap cutBitmap(final Bitmap originalBmp, Rect src, Rect dest) {
    Bitmap croppedBitmap = Bitmap.createBitmap(dest.width(), dest.height(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(croppedBitmap);
    canvas.drawBitmap(originalBmp, src, dest, null);
    return croppedBitmap;
}

Теперь croppedBitmap содержит нижнюю левую часть вашего original. Подайте его в свой алгоритм размытия.

Далее, если вы хотитенарисуйте размытую часть на original, затем вы просто получите canvas на original bitmap и нарисуете blurred bitmap, используя srcRect.

Canvas c = new Canvas(original);
c.drawBitmap(bitmap obtained from blur algorithm, srcRect.left, srcRect.top, null);
...