Android:加载Alpha掩码位图

14

我有一个单通道的PNG文件,想将其用作Porter-Duff绘图操作的Alpha蒙版。如果我不使用任何选项加载它,则生成的Bitmap具有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时会发生什么? - EboMike
与 ALPHA_8 相同的结果。我得到了一个带有不透明 alpha 通道的 ARGB_8888 位图。 - kvance
你的png是哪种颜色类型?我猜测是0,也就是灰度。据我所知,没有“仅alpha”的png文件。最接近的可能是一个8位调色板,其中索引到alpha的映射是恒等的 - 为了文件大小。但可能不值得。你下面的解决方法可能是你能得到的最好的。但我不想成为那个人:API在试图告诉你什么!始终将alpha和RGB放在一起。这样做会更快,支持也更好。使用ALPHA_8会使你走上错误的道路。如果可能的话,请尝试将设计更改为RGBA。 - starmole
@starmole 正确,它是一张灰度PNG图片。在这种情况下,我有带有alpha通道的大型动画精灵。就应用程序大小而言,使用JPEG压缩RGB数据和PNG压缩alpha通道是非常值得的。 - kvance
1个回答

7

这更像是一个权宜之计而非解决方案:

现在我将 alpha 通道与 RGB 通道都为零的 RGBA PNG 文件一起使用。我可以使用 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
@TenFour04 不幸的是,从未这样做过。 - kvance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接