2013-05-01 58 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的冪。