【问题标题】:Android: loading an alpha mask bitmapAndroid:加载 alpha 蒙版位图
【发布时间】:2010-10-28 19:12:00
【问题描述】:

我有一个单通道 PNG 文件,我想将其用作 Porter-Duff 绘图操作的 alpha 蒙版。如果我在没有任何选项的情况下加载它,则生成的位图具有 RGB_565 配置,即视为灰度。如果我将首选配置设置为 ALPHA_8,它会将其加载为灰度 ARGB_8888。

如何说服 Android 将此文件视为 alpha 蒙版而不是灰度图像?

mask1 = BitmapFactory.decodeStream(pngStream);
// mask1.getConfig() is now RGB_565

BitmapFactory.Options maskOpts = new BitmapFactory.Options();
maskOpts.inPreferredConfig = Bitmap.Config.ALPHA_8;
mask2 = BitmapFactory.decodeStream(pngStream, null, maskOpts);
// mask2.getConfig() is now ARGB_8888 (the alpha channel is fully opaque)

【问题讨论】:

  • 将首选配置设置为 ARGB_8888 时会发生什么?
  • 与 ALPHA_8 的结果相同。我得到一个带有不透明 alpha 通道的 ARGB_8888 位图。
  • 您的 png 是什么颜色类型的?我猜是0,也就是灰度。据我所知,没有“仅限 alpha”的 png 文件。你能得到的最接近的将是一个 8 位调色板,它具有索引到 alpha 的标识映射 - 用于文件大小。但可能不值得。下面的解决方法可能是您能得到的最好的解决方法。但我讨厌成为那种人:API 试图在这里告诉你一些事情!将 alpha 和 RGB 保持在一起。总是。它将更快,更好的支持。通过使用 ALPHA_8,您离开了良好的道路。如果可能,请尝试将您的设计更改为 RGBA。
  • @starmole 正确,它是灰度 PNG。在这种特殊情况下,我有带有 Alpha 通道的大型动画精灵。就应用程序大小而言,使用 JPEG 压缩 RGB 数据和使用 PNG 压缩 alpha 通道是非常值得的。

标签: android graphics


【解决方案1】:

更多的是解决方法而不是解决方案:

我现在将 Alpha 通道包含在 RGBA PNG 文件中,其中 RGB 通道全为零。我可以使用 ARGB_8888 的首选配置加载此文件,然后提取其 alpha 通道。这在掩码文件中浪费了几 KB,并在解码图像时占用了大量内存。

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap source = BitmapFactory.decodeStream(pngStream, null, opts);
Bitmap mask = source.extractAlpha();
source.recycle();
// mask.getConfig() is now ALPHA_8

【讨论】:

  • 您找到更好的解决方案了吗?我遇到了同样的问题。
  • @TenFour04 不幸的是,从来没有。
猜你喜欢
  • 1970-01-01
  • 2015-12-10
  • 2014-05-11
  • 1970-01-01
  • 2014-10-27
  • 2011-07-03
  • 2023-03-11
  • 1970-01-01
  • 2011-09-18
相关资源
最近更新 更多