如何制作 BitmapDrawable 的深拷贝?

Posted

技术标签:

【中文标题】如何制作 BitmapDrawable 的深拷贝?【英文标题】:How do I made a deep copy a BitmapDrawable? 【发布时间】:2012-06-01 11:52:31 【问题描述】:

我在克隆 BitmapDrawable 时遇到问题。我在this post 中尝试了答案,但它创建了一个“浅”副本,我需要一个“深”副本,这样我就可以在不影响原件的情况下更改克隆中的像素。

我也试过这个:

    Bitmap bitmap = bdOriginal.getBitmap();
    BitmapDrawable bdClone = new BitmapDrawable(getResources(), bitmap.copy(bitmap.getConfig(), true));

但它似乎创建了一个不可变的克隆,即使我将 Bitmap.copy() 中的可变参数设置为“true”。也就是说,滤色器似乎不会改变克隆。我做错了吗? (编辑:我使用调试器确认 bitmap.mIsMutable = true)

总而言之,我需要一个 BitmapDrawable 的克隆,它可以使用颜色过滤器进行更改,而不会影响原件。有什么建议吗?

提前谢谢...

【问题讨论】:

试试drawable方法mutable(). 谢谢,但是 BitmapDrawable 仍然不受颜色过滤器的影响。 :( 我知道过滤器正在工作,因为它适用于原始位图和浅拷贝。 【参考方案1】:
    创建相同大小的新Bitmap。 为这个新的Bitmap 创建画布 将您的第一个 Bitmap 绘制到此画布中。

例子:

Bitmap copy = Bitmap.createBitmap(original.getWidth(), original.getHeight(), original.getConfig());
Canvas copiedCanvas = new Canvas(copy);
copiedCanvas.drawBitmap(original, 0f, 0f, null);

【讨论】:

以上是关于如何制作 BitmapDrawable 的深拷贝?的主要内容,如果未能解决你的问题,请参考以下文章

对象数组的深拷贝

python中dict的深拷贝

如何实现对象的深拷贝

JS中如何进行对象的深拷贝

list.addAll()是浅拷贝,如何实现list的深拷贝

list.addAll()是浅拷贝,如何实现list的深拷贝