我可以在android中模糊位图的特定区域吗?

hmae6n7t  于 2023-03-21  发布在  Android
关注(0)|答案(3)|浏览(114)

我想模糊位图的一个特定区域。例如,我有一个200x400分辨率的位图,想从中间模糊它,比如从100x300点到50点。
有人有主意吗?

tkqqtvp1

tkqqtvp11#

您可以使用**RenderScript**在Android中模糊位图。
RenderScript对于执行图像处理、计算摄影或计算机视觉的应用尤其有用。我们可以通过两种方式访问Android RenderScript框架API:
直接使用android.renderscript API类。这些类可从Android 3.0(API级别11)及更高版本获得。或者,您可以使用android.support.v8.renderscript支持包类。支持库类可用于运行Android 2.2(API级别8)及更高版本的设备。
要使用支持库RenderScript API,您必须具有Android SDK工具修订版22.2或更高版本以及SDK构建工具修订版18.1.0或更高版本
以下代码片段可用于在Android中使用RenderScript API创建位图模糊效果。

//Set the radius of the Blur. Supported range 0 < radius <= 25
private static final float BLUR_RADIUS = 25f;

public Bitmap blur(Bitmap image) {
    if (null == image) return null;

    Bitmap outputBitmap = Bitmap.createBitmap(image);
    final RenderScript renderScript = RenderScript.create(this);
    Allocation tmpIn = Allocation.createFromBitmap(renderScript, image);
    Allocation tmpOut = Allocation.createFromBitmap(renderScript, outputBitmap);

    //Intrinsic Gausian blur filter
    ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript));
    theIntrinsic.setRadius(BLUR_RADIUS);
    theIntrinsic.setInput(tmpIn);
    theIntrinsic.forEach(tmpOut);
    tmpOut.copyTo(outputBitmap);
    return outputBitmap;
}

您可以使用上面的代码片段模糊ImageView,如下所示。

ImageView imageView = (ImageView) findViewById(R.id.imageView);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.nature);
Bitmap blurredBitmap = blur(bitmap);
imageView.setImageBitmap(blurredBitmap);

希望对你有帮助。

f3temu5u

f3temu5u2#

渲染脚本无法在每个API级别中工作,因此请使用此库在图像https://android-arsenal.com/details/1/2192上产生模糊效果

jogvjijk

jogvjijk3#

我使用了以下选项:
1.从位图裁剪区域
1.模糊裁剪区域
1.**奖励:**从作物区域中切割出Cricle
1.覆盖裁剪区域
我在网上找到的功能:
作物:

Bitmap cropImage = Bitmap.createBitmap(image, point.getX() - radius, point.getY() - radius, 2 * radius, 2 * radius);

模糊:

public static Bitmap blur(Bitmap image, int radius) {
    if (null == image) return null;

    Bitmap outputBitmap = Bitmap.createBitmap(image);
    final RenderScript renderScript = RenderScript.create(getMainActivity());
    Allocation tmpIn = Allocation.createFromBitmap(renderScript, image);
    Allocation tmpOut = Allocation.createFromBitmap(renderScript, outputBitmap);

    //Intrinsic Gausian blur filter
    ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript));
    theIntrinsic.setRadius(radius);
    theIntrinsic.setInput(tmpIn);
    theIntrinsic.forEach(tmpOut);
    tmpOut.copyTo(outputBitmap);
    return outputBitmap;
}

获取圆圈:

public static Bitmap getCircularBitmap(Bitmap bitmap) {
    Bitmap output;

    if (bitmap.getWidth() > bitmap.getHeight()) {
        output = Bitmap.createBitmap(bitmap.getHeight(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
    } else {
        output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getWidth(), Bitmap.Config.ARGB_8888);
    }

    Canvas canvas = new Canvas(output);

    final int color = 0xff424242;
    final Paint paint = new Paint();
    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());

    float r = 0;

    if (bitmap.getWidth() > bitmap.getHeight()) {
        r = bitmap.getHeight() / 2;
    } else {
        r = bitmap.getWidth() / 2;
    }

    paint.setAntiAlias(true);
    canvas.drawARGB(0, 0, 0, 0);
    paint.setColor(color);
    canvas.drawCircle(r, r, r, paint);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    canvas.drawBitmap(bitmap, rect, rect, paint);
    return output;
}

最终日期:

public static Bitmap blurPoint(Bitmap image, Point point, int radius) {
        Bitmap cropImage = Bitmap.createBitmap(image, point.getX() - radius, point.getY() - radius, 2 * radius, 2 * radius);
        Bitmap blurImage = blur(cropImage, 10);
        Bitmap circleImage = getCircularBitmap(blurImage);
        return putOverlay(image, circleImage, new Point(point.getX() - radius, point.getY() - radius));
}

我不知道这种方法的性能如何,但是我测试了在绘制模式下绘制这个模糊,没有延迟。

相关问题