2

我正在用 Java 创建这个 Android 项目。但是,我想知道一些 Bitmap 方法的引用会走多远。

我有一个最初的位图,就像:

Bitmap originalBitmap = BitmapFactory.decodeResource(resources, bitmapID);

然后我将它发送到一个基本类的构造函数中的一个对象:

class Test
{
    Bitmap memberBitmap;

    Test(Bitmap b)
    {
        memberBitmap = b;
    }
}

到目前为止,我知道 memberBitmap 仍然是对 originalBitmap 的引用。但我想做的基本上是使用以下方法调整此位图的大小:

memberBitmap = Bitmap.createScaledBitmap(memberBitmap, newWidth, newHeight, filter);

我现在是在内存中存储了一个新的位图还是更改了原始位图?

如果是这样我创建了一个新的位图,是否会进行任何更改以使其更新原始位图?

喜欢:

memberBitmap.createScaledBitmap(memberBitmap, newWidth, newHeight, filter);
4

2 回答 2

0

从那个 API 的声音来看,它可能正在内存中创建一个新的位图。您可以通过在构造函数运行后打印出toString()两个对象上的 来检查这一点,并查看它们的内存位置是否相同。

对于第二个问题:将originalBitmapto 引用更改为 new Bitmap

于 2013-05-01T18:02:09.123 回答
0

它实际上是在创建一个新的位图。在这种情况下,它将创建一个新的位图,而您将失去对旧位图的引用。如果你这样做的代码是这样的:

memberBitmap = b;
Bitmap scaledBitmap = Bitmap.createScaledBitmap(memberBitmap, newWidth, newHeight, filter);

您会看到它memberBitmap保持不变并且scaledBitmap是更大或更小的版本。但是,一个例外是,如果根本不进行缩放,在这种情况下,它只会返回对的引用,memberBitmap并且您将拥有对同一对象的两个引用。

您可以删除工作的一种方法是首先使用BitmapFactory.Options参数创建更小的位图。例如:

BitmapFactory.Options o = new BitmapFactory.Options();
o.inSampleSize = 2;
Bitmap originalBitmap = BitmapFactory.decodeResource(resources, bitmapID);

这将创建一个为原始图像大小(宽度和高度)一半的位图。不幸的是,这是非常有限的,并且 的值inSampleSize必须是 2 的幂。

于 2013-05-01T18:13:54.350 回答