【问题标题】:Transparent GIF in Android ImageViewAndroid ImageView 中的透明 GIF
【发布时间】:2014-10-09 15:30:26
【问题描述】:

我试图在我的应用程序中显示透明的 GIF 图像,但没有成功。我可以下载并在 ImageView 中显示图标,但背景为白色而不是透明。

我已经尝试了这些解决方案但没有成功: Convert GIF to PNG programatically

有人知道如何以透明方式显示 GIF 图像吗?我正在使用 Android 18 SDK。

【问题讨论】:

  • Here 是描述问题的错误报告。不确定谷歌是否计划修复它。也许盯着它会有所帮助。
  • 谢谢保罗,我已经看过了!但是即使我使用比 4.4 更早的 SDK,仍然会出现同样的问题。
  • 它应该基于您设备上的 android 版本,而不是您构建的 SDK。您是否在 4.4 设备上进行测试?我有一个解决方法,我会尽快发布。
  • 是的,你完全正确。我使用的是 4.4 设备。我刚刚在 4.3 模拟器中尝试了相同的代码,并且透明度工作正常。我正在等待您的解决方法:) 再次感谢。

标签: android imageview transparent gif android-4.4-kitkat


【解决方案1】:

这是一个对我有用的解决方法。这不是一个好的解决方案。它可能不适用于所有情况,并且在图像处理中存在大量开销。希望其他人能找到更好的解决方案。

在我的测试中,4.4 中的 GIF 图像具有白色 (-1) 或黑色 (-16777216) 的透明度值。加载位图后,您可以将白色/黑色像素转换回透明。当然,这仅在图像的其余部分不使用相同颜色时才有效。如果是这样,那么您还将图像的某些部分转换为原始图像中不透明的透明部分。就我而言,这不是问题。

您可以使用以下代码将白色或黑色像素转换为透明。

Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
bitmap = eraseBG(bitmap, -1);         // use for white background
bitmap = eraseBG(bitmap, -16777216);  // use for black background


private static Bitmap eraseBG(Bitmap src, int color) {
    int width = src.getWidth();
    int height = src.getHeight();
    Bitmap b = src.copy(Config.ARGB_8888, true);
    b.setHasAlpha(true);

    int[] pixels = new int[width * height];
    src.getPixels(pixels, 0, width, 0, 0, width, height);

    for (int i = 0; i < width * height; i++) {
        if (pixels[i] == color) {
            pixels[i] = 0;
        }
    }

    b.setPixels(pixels, 0, width, 0, 0, width, height);

    return b;
}

注意:我必须将位图复制到新的 ARGB_8888 图像才能工作。即使将位图加载为可变的,我仍然无法修改像素。这也是开销如此之大的部分原因。

【讨论】:

  • 我不知道。您必须尝试一下。
  • 我觉得不是
  • @paul 这是一个很好的答案,但是,在我的情况下,图像似乎使用不同的背景颜色来实现透明度,有些是粉红色背景,有些是青色,有些是黑色,还有一些是黑色背景图像本身周围有一个小白框,并且在 API >23 和浏览器中以某种方式正确呈现透明度。我猜这是因为标题包含该信息。是否有解决方法(我无法控制的数千张图像)?在提出新问题之前先在这里提问。
  • 图像中有透明度信息,但由于 Android 错误而无法正确显示。它在 API 23+ 中可以正常工作,因为他们修复了这个错误。我仍然将此解决方法应用于 API 19-22。我不确定你是否能以某种方式让它工作。
  • 这家伙真的很有帮助!
【解决方案2】:

您可以使用 GIMP(操作源 GNU 软件)将 GIF 转换为 PNG。安装软件,打开 GIF,然后将其导出为 PNG。

【讨论】:

  • 我不能这样做,因为我使用的是从网站下载的 GIF 图像(我无法控制它)。
  • 我怎么没想到呢?当然,转换图像!点赞!
【解决方案3】:

您可以使用GifDecoder from android-gifview 代替 BitmapFactory 来解码 GIF:

GifDecoder gd = new GifDecoder();
gd.read(new FileInputStream(filename));
return gd.getBitmap();

它对我有用。

【讨论】:

  • kord 不是,因为它使用了一个庞大的库来处理大约 10 个字符串可以完成的事情(请参阅@paul 答案)。
  • 这是解决方案,如果图像包含透明和白色/黑色像素。那么保罗的回答是没有用的。 GifDecoder 库并不庞大 (16KB)。
  • 但是 BitmapFactory 更快。仅在必要时使用 GIFDecoder (API 19-22)。
猜你喜欢
  • 1970-01-01
  • 2015-06-18
  • 2015-05-12
  • 2021-03-18
  • 2015-12-11
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
相关资源
最近更新 更多