BitmapFactory decode() 中的 Android 位图是不是包含透明信息?

Posted

技术标签:

【中文标题】BitmapFactory decode() 中的 Android 位图是不是包含透明信息?【英文标题】:Does an Android Bitmap from BitmapFactory decode() contain transparent information?BitmapFactory decode() 中的 Android 位图是否包含透明信息? 【发布时间】:2015-10-27 18:53:48 【问题描述】:

我已将 AnimateGIFWriter 的 Java 实现移植到 android here。它工作正常,除了我没有得到透明度。我尝试将Options 传递给 decode() 方法,如下所示:

Options opts = new Options();
opts.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeStream(fin, null, opts);

将输入图像读入位图后,我将通过Bitmap.getPixels() 将数据作为int 数组抓取,并自动检测alpha 值的透明度。但这不起作用 - 生成的动画 GIF 不透明(输入图像都是透明的,我的代码应该通过自动透明检测来保持它们。这适用于桌面应用程序)。

我对 Android 相关的东西不太熟悉。我的问题是上面的配置,BitmapFactory.decode()会保留输入图片的透明度信息吗?

更新:我发现图像支持完全 alpha 透明度,如 PNG 图像,它确实保留了透明度信息。但是对于像 GIF 这样的单色透明图像,似乎不是。这需要进一步确认。

【问题讨论】:

【参考方案1】:

我的问题是上面的配置,BitmapFactory.decode()会保留输入图片的透明度信息吗?

是的,应该将透明度/alpha 加载到该位图中。

要验证这一点,您可以尝试获取单个像素的值(可能是 (0,0))并将其打印到日志中。

我没有时间(或不想)深入了解您的全部 1600 行代码,但我会怀疑 writeFrame 方法中的这一部分:

 if(frame.getTransparencyFlag() == GIFFrame.TRANSPARENCY_INDEX_SET && frame.getTransparentColor() != -1) 

【讨论】:

谢谢,斯尼尔德。可疑线是自动透明度检测的一部分。这不太可能产生任何问题。 对于像 PNG 图像这样的全 alpha 透明度,我发现加载的位图确实保持了透明度。但是对于像 GIF 图像这样的单色透明度,它似乎不是。

以上是关于BitmapFactory decode() 中的 Android 位图是不是包含透明信息?的主要内容,如果未能解决你的问题,请参考以下文章

显示大图片的技巧

Android OOM的解决方式

Android加载大图片OOM异常解决

解决Android加载图片时内存溢出的问题

怎么防止imagecreatefromjpeg内存溢出

Android 如何使用 BitmapFactory 选项缩放图像