2013-05-01 38 views
2

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

我有一个原来的位图就像:

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

,然后我把它发送到对象的基本类的构造函数中:

class Test 
{ 
    Bitmap memberBitmap; 

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

这一步,我知道memberBitmap仍对originalBitmap的引用。但我想这样做基本上是使用调整该位图:

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

难道我现在存储在一个新的位图到内存或已经改变了我的originalBitmap?

如果这样我创建了一个新的位图,是否会有任何更改使其更新originalBitmap?

像:

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

回答

0

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

对于第二个问题:更改originalBitmap以引用新的Bitmap

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的幂。