使用具有大量透明区域的 png 时内存消耗大幅上升

Huge spike in memory consumption when using png with lot of transparent area

我在我的应用程序中使用带有 png 背景 按钮 作为 CopyToClipboard 功能(在各种片段中使用了大约 6-7 次).由于 图像应该很小 以达到我的目的,我通过在图像周围放置 额外透明区域 来增加图像的面积,这样我就可以增加可点击区域的按钮大小,但保持图像较小(我知道它效率不高,因为然后我设计了更好的方法来实现这一目标。

我后来在上传一些其他图片(大约 150kb 大小的大图片)时注意到了巨大的峰值,并且经过大量调试(我的意思是很多!)我发现问题不是由于更大的图像,但由于 CopyToClipboard 图像的大小仅为 8kb!改回较旧的 CopyToClipboard 图像(具有较小的透明区域)使内存消耗恢复正常。

我的问题是为什么会这样?对于这样一个 小图像 来创建如此巨大的尖峰(超过 两倍的内存消耗 )并使应用程序变慢,这是非常莫名其妙的。

如下图:白色区域为透明区域。我的按钮尺寸:15dp x 15dp .

我再说一遍,我的问题是 为什么会这样? 不是解决方案因为我已经解决了这个问题。

你的图片在磁盘上只有 7-8KB 并不重要,因为它在解码时会占用更多的内存。

显然,大的透明区域可以在 PNG 文件中有效地编码,所以图像有那么小的尺寸。 但实际上,它的尺寸是 (600 x 745),所以在内存中它大约需要 (600 * 745 * 4) 字节,加上一些元信息,所以将近 2 兆字节。 4 乘数代表使用 alpha 通道对颜色进行编码所需的字节数。 Android 位图在内部由线性 one-dimensional 整数数组表示,因此您可以想象系统需要分配一个大小为 600 * 745 = 447000 的数组来创建您的位图。

这就是为什么如此简单的图像占用内存如此之高的原因。