canvas 高斯模糊效果

// imgData:canvas 的 getImageData 方法返回值
// radius:模糊的半径
function gaussBlur(imgData, radius) {

  radius *= 3;    //不知为什么,我的模糊半径是 css中 filter:bulr 值的三倍时效果才一致。

  //Copy图片内容
  let pixes = new Uint8ClampedArray(imgData.data);
  const width = imgData.width;
  const height = imgData.height;
  let gaussMatrix = [],
    gaussSum,
    x, y,
    r, g, b, a,
    i, j, k,
    w;

  radius = Math.floor(radius);
  const sigma = radius / 3;

  a = 1 / (Math.sqrt(2 * Math.PI) * sigma);
  b = -1 / (2 * sigma * sigma);

  //生成高斯矩阵
  for (i = -radius; i <= radius; i++) {
    gaussMatrix.push(a * Math.exp(b * i * i));
  }

  //x 方向一维高斯运算
  for (y = 0; y < height; y++) {
    for (x = 0; x < width; x++) {
      r = g = b = a = gaussSum = 0;
      for (j = -radius; j <= radius; j++) {
        k = x + j;
        if (k >= 0 && k < width) {
          i = (y * width + k) * 4;
          w = gaussMatrix[j + radius];

          r += pixes[i] * w;
          g += pixes[i + 1] * w;
          b += pixes[i + 2] * w;
          a += pixes[i + 3] * w;

          gaussSum += w;
        }
      }

      i = (y * width + x) * 4;
      //计算加权均值
      imgData.data.set([r, g, b, a].map(v => v / gaussSum), i);
    }
  }

  pixes.set(imgData.data);

  //y 方向一维高斯运算
  for (x = 0; x < width; x++) {
    for (y = 0; y < height; y++) {
      r = g = b = a = gaussSum = 0;
      for (j = -radius; j <= radius; j++) {
        k = y + j;

        if (k >= 0 && k < height) {
          i = (k * width + x) * 4;
          w = gaussMatrix[j + radius];

          r += pixes[i] * w;
          g += pixes[i + 1] * w;
          b += pixes[i + 2] * w;
          a += pixes[i + 3] * w;

          gaussSum += w;
        }
      }
      i = (y * width + x) * 4;
      imgData.data.set([r, g, b, a].map(v => v / gaussSum), i);
    }
  }

  return imgData;
};

详细内容请看下文:
本文转载:https://blog.csdn.net/xuanhun521/article/details/109362541

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Android开发中,最近任务高斯模糊可以通过以下步骤实现: 1. 首先,在你的布局文件中添加一个FrameLayout,用于显示最近任务列表。 2. 然后,在你的Activity中获取最近任务列表的视图,并将其转换为Bitmap对象。 3. 接下来,使用RenderScript库中的高斯模糊算法对Bitmap对象进行模糊处理。 4. 最后,将处理后的Bitmap对象设置为最近任务列表的背景,从而实现高斯模糊效果。 下面是一些示例代码,展示了如何在Android应用中实现最近任务高斯模糊效果: ``` // 获取最近任务列表的视图 View recentTasksView = getRecentTasksView(); // 将视图转换为Bitmap对象 Bitmap bitmap = Bitmap.createBitmap( recentTasksView.getWidth(), recentTasksView.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); recentTasksView.draw(canvas); // 使用RenderScript库中的高斯模糊算法对Bitmap对象进行模糊处理 bitmap = blurBitmap(bitmap, 25); // 将处理后的Bitmap对象设置为最近任务列表的背景 recentTasksView.setBackground(new BitmapDrawable(getResources(), bitmap)); ``` 其中,blurBitmap()方法可以使用以下代码实现: ``` private Bitmap blurBitmap(Bitmap bitmap, int radius) { RenderScript rs = RenderScript.create(this); Allocation input = Allocation.createFromBitmap(rs, bitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT); Allocation output = Allocation.createTyped(rs, input.getType()); ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); blur.setInput(input); blur.setRadius(radius); blur.forEach(output); output.copyTo(bitmap); rs.destroy(); return bitmap; } ``` 需要注意的是,高斯模糊算法需要较高的计算资源,因此在处理大尺寸的Bitmap对象时可能会出现性能问题。为了避免这种情况,可以考虑在后台线程中进行处理,或者使用更加轻量级的模糊算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值