2011-12-01 52 views
5

在我的代碼我在做這樣的事情:爲什麼有時位圖是相同的對象?

public void doStuff() { 
    Bitmap scaledBitmap = decodeFileAndResize(captureFile); 
    saveResizedAndCompressedBitmap(scaledBitmap); 

    Bitmap rotatedBitmap = convertToRotatedBitmap(scaledBitmap); 
    driverPhoto.setImageBitmap(rotatedBitmap); 

    if (rotatedBitmap != scaledBitmap) { 
     scaledBitmap.recycle(); 
     scaledBitmap = null; 
     System.gc(); 
    } 
} 

private Bitmap convertToRotatedBitmap(Bitmap scaledBitmap) throws IOException { 
    ExifInterface exifInterface = new ExifInterface(getCaptureFilePath()); 
    int exifOrientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, 0); 
    float orientationDegree = getRotationDegree(exifOrientation); 
    Matrix rotateMatrix = new Matrix(); 
    rotateMatrix.postRotate(orientationDegree); 

    return Bitmap.createBitmap(scaledBitmap, 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight(), rotateMatrix, true); 
} 

一切工作正常,但是當我評論if (rotatedBitmap != scaledBitmap) {我對使用回收的位圖的錯誤。

Android是否在每次Bitmap.createBitmap調用創建新的位圖,我怎樣才能避免位圖之間比較呢?

+0

由於'createBitmap(..)'您使用返回不可變的位圖的方法,很可能它實際上是存儲'scaledBitmap'作爲成員,而不是從頭開始創建一個新的位圖。 – harism

+0

其實,還有一個,如果'createBitmap(...)'作爲參數給出返回相同的位圖中-clause。也許你的代碼碰到了這個確切的例子:scaledBitmap == rotatedBitmap'。 [Bitmap.java(http://www.java2s.com/Open-Source/Android/android-core/platform-frameworks-base/android/graphics/Bitmap.java.htm) – harism

+0

我認爲你正在做的事情錯了這裏。該代碼行'rotatedBitmap!= scaledBitmap'會給你真正的所有您比較兩個對象,而這些都是不primitives.So兩個對象不等於對方time.Because。 – sampathpremarathna

回答

3

createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)從可選矩陣轉換的源位圖的子集中返回不可變位圖。

創建位圖方法將返回被傳遞相同的位圖方法,如果滿足以下所有條件滿足

  • 如果您sourceBitmap中是不可變的,
  • 像素從0,0 XY開始的和
  • 預期的寬度和高度與原始寬度和高度相同
  • 矩陣爲空

在Android源代碼的東西已被寫入類似下面的

if (!source.isMutable() && x == 0 && y == 0 
       && width == source.getWidth() && height == source.getHeight() 
       && (m == null || m.isIdentity())) { 
      return source; 
    } 

從這裏

http://www.netmite.com/android/mydroid/frameworks/base/graphics/java/android/graphics/Bitmap.java

見BitMap.java的源代碼http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/graphics/Bitmap.java

相關問題