Android 中使用黑白 alpha 蒙版的高效位图蒙版

2024-05-14

我想用黑白 alpha 蒙版来掩盖位图。我的蒙版图像是黑白的,黑色区域意味着透明,白色区域意味着不透明。

我需要的是:当我使用此蒙版图像来蒙版任何其他图像时,如果蒙版图像的相应区域为黑色,则生成的图像区域应为透明。否则,生成的图像区域应该是不透明的。

我已附上示例图像。请帮我解决这些问题。

示例图片: 用于遮罩的示例图像 https://www.dropbox.com/s/yowmu6aco5e44sm/SampleImage.jpg

到目前为止我已经尝试过:以下方法效果很好。但它们非常慢。我需要一些在速度和内存方面比这些方法更有效的解决方案。

  • 第一种方法:

      int width = rgbDrawable.getWidth();
      int height = rgbDrawable.getHeight();
    
      if (width != alphaDrawable.getWidth() || height != alphaDrawable.getHeight()) {
        throw new IllegalStateException("image size mismatch!");
      }
    
      Bitmap destBitmap = Bitmap.createBitmap(width, height,
          Bitmap.Config.ARGB_8888);
    
      int[] pixels = new int[width];
      int[] alpha = new int[width];
    
      for (int y = 0; y < height; y++)
      {
          rgbDrawable.getPixels(pixels, 0, width, 0, y, width, 1);
          alphaDrawable.getPixels(alpha, 0, width, 0, y, width, 1);
    
          for (int x = 0; x < width; x++) 
          {
              // Replace the alpha channel with the r value from the bitmap.
              pixels[x] = (pixels[x] & 0x00FFFFFF) | ((alpha[x] << 8) & 0xFF000000);
          }
    
        destBitmap.setPixels(pixels, 0, width, 0, y, width, 1);
      }
    
      alphaDrawable.recycle();
      rgbDrawable.recycle();
    
      return destBitmap;
    
  • 第二种方法

        float[] nlf =  new float[] {
                                0, 0, 0, 0, 0,
                                0, 0, 0, 0, 0,
                                0, 0, 0, 0, 0,
                                1, 0, 0, 0, 0};
    
    ColorMatrix sRedToAlphaMatrix = new ColorMatrix(nlf);
    
    ColorMatrixColorFilter sRedToAlphaFilter = new ColorMatrixColorFilter(sRedToAlphaMatrix);
    
    // Load RGB data
    Bitmap rgb = rgbDrawable;
    
    // Prepare result Bitmap
    Bitmap target = Bitmap.createBitmap(rgb.getWidth(), rgb.getHeight(), Bitmap.Config.ARGB_8888);
    
    Canvas c = new Canvas(target);
    c.setDensity(Bitmap.DENSITY_NONE);
    
    // Draw RGB data on our result bitmap
    c.drawBitmap(rgb, 0, 0, null);
    
    // At this point, we don't need rgb data any more: discard!
    rgb.recycle();
    rgb = null;
    
    // Load Alpha data
    Bitmap alpha = alphaDrawable;
    
    // Draw alpha data on our result bitmap
    final Paint grayToAlpha = new Paint();
    grayToAlpha.setColorFilter(sRedToAlphaFilter);
    grayToAlpha.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
    c.drawBitmap(alpha, 0, 0, grayToAlpha); 
    
    // Don't need alpha data any more: discard!
    alpha.recycle();
    alpha = null;
    
    return target;
    

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 中使用黑白 alpha 蒙版的高效位图蒙版 的相关文章

  • Android Volley 对于一个请求返回两次结果

    我两天来一直在试图解决这个问题 但我完全被难住了 由于某种原因 我向队列发送一个请求 但 volley 返回两次 这会调用侦听器两次并使列表视图中的结果加倍 我打开了 Volley 的日志记录 可以看到请求被添加到队列中并返回 然后几秒钟后
  • Android 的 Firestore 超时

    我目前正在构建一个应用程序 将用户的博客文章保存在Firestore服务器 一切正常 但我发现该帖子在不稳定的互联网连接下无法上传 我尝试设置一个超时到Firestore实例 但 Firestore 库似乎没有超时选项 问题是 由于没有超时
  • Cordova 无法构建项目

    Update 新读者 请检查我最后的编辑 更新cordova后 无法构建 运行 Mac mini de Toni funcook toniweb sudo cordova build Password Running command Use
  • Android 中的振动器

    如何创建Vibrator对象并调用vibrate函数 http developer android com reference android os Vibrator html http developer android com refe
  • Jetpack Compose 中的图像裁剪器?

    我到处搜索 但没有找到有关在 Jetpack Compose 中裁剪图像的文档 如何在 Jetpack Compose 中裁剪图像 实际上 您可以使用那些较旧的 Android 库 没有问题 我用的是这个 https github com
  • android 无法解析方法 setcontentview

    今天在android studio 中遇到了一个错误 我正在尝试在应用程序中创建一个关于我们的屏幕 布局 xml 文件已创建 任何帮助表示赞赏 谢谢 错误 无法解析方法 setcontentview int package example
  • 如何在不将焦点设置到另一个控件的情况下删除焦点?

    我喜欢直观的用户界面 每个屏幕都应该自然 不引人注目地引导用户进入应用程序的下一步 除此之外 我努力让事情尽可能地令人困惑和混乱 只是在开玩笑 我有三个TableRows 每个都包含一个只读且不可聚焦的 EditText 控件 然后在其右侧
  • 如何避免 Android 游戏中的时钟漏洞?

    我需要测量一段可以持续几个小时的时间 我假设执行此操作的正常方法是这样的 Date date new Date wait some time new Date getTime date getTime 但是用户是否可以将 Android 的
  • Android studio总是乱码

    I have change the encode to UTF 8 so I got this problem who can help me I reinstalled it twice but android studio1 4 Alw
  • 如何在android.mk文件中指定c头文件

    我有一个 c 源文件夹名称 clib 其中 我有一些示例文件 例如 1 h 1 c 2 h 2 c 3 c 3 h 在该文件夹之外我有 4 个 h 4 c 4 jni h 4 jni c 现在为了构建 so 我创建了像这样的 android
  • 使用actionBar推送视图的正确方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我是一名新的 Android 开发人员 所以我更喜欢询问正确的方法来解决我的问题 我有一个 FragmentActivity 和多个片段
  • TextView 中缩进项目符号列表

    我有一个 TextView 我用 strings xml 中的字符串资源中的文本填充它 字符串资源包含 元素 用于在 TextView 内创建项目符号列表 我的问题是我想控制项目符号列表中跨越多行的行的缩进 默认情况下 文本不会缩进超过项目
  • 解析JSON数据并将其放入gridview中

    我正在开发一个应用程序 我必须在其中解析JSON数据并且必须将它们放入自定义中gridview 它应该是这样的 到目前为止 我已经在 asynctask 中解析了 JSON 数据并获取了这些值 这是我的代码 private class ge
  • Android 中 Admob 的 XML 或 Java 关键字

    我似乎找不到任何有关通过 XML 或 Java 设置 adMob 广告关键字的可靠文档 我已经尝试过中看到的方法this https stackoverflow com questions 5066129 android admob api
  • Android Studio安装JDK错误

    In Android Studio I am facing bellow error 当我按下时会显示此弹出窗口Alt Enter对于缺少的类 符号 当我点击 setup SDK 时 它显示两个选项 1 8 Java版本 1 8 0 60
  • 如何在两种不同模式、两种布局中设置方向?

    我有一个叫做Main XML我将方向设置为纵向AndroidManifest xml 我也为 Honeycomb 设计了这个布局并将其放置在layout xlarge mdpi文件夹 但我想使用Main XML in layout xlar
  • Android BottomNavigationView 与自定义视图作为图标[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试 Android 支持库中的新 BottomNavigationView 对于其中一个菜单项 我希望有一个自定义视图 以便我
  • 如何为Android设置图像顶部和底部相同的大小?

    我想在中心 顶部和底部显示相同尺寸的图像 请参阅下面的屏幕 有人知道请给我代码 谢谢大家 Use android scaleType centerInside or ImageView setScaleType ImageView Scal
  • 如何在 Android 中通过 gradle 列出 buildConfig 中的所有类型

    这是一个简单的 gradle 具有三种风格 apply plugin com android application android compileSdkVersion 23 buildToolsVersion 23 0 2 default
  • 扩展Android应用程序类

    当我正在寻找从远程设备获取错误报告的解决方案时 就像 iOS 中的试飞应用程序一样 我发现了acra适用于 Android 设备here http code google com p acra wiki BasicSetup 在基本设置中

随机推荐