2011-12-01 15 views
5

W moim kodu robię coś takiego:Dlaczego czasami bitmapy to te same obiekty?

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); 
} 

Wszystko działa poprawnie, ale kiedy komentując if (rotatedBitmap != scaledBitmap) { Mam błędów związanych z użytkowaniem Bitmap z recyklingu.

Czy Android tworzy nową mapę bitową dla każdego połączenia Bitmap.createBitmap i jak mogę uniknąć porównywania bitmap?

+0

Ponieważ metoda 'createBitmap (..)', której używasz, zwraca niezmienną bitmapę, prawdopodobnie zapisuje 'scaledBitmap' jako element, zamiast tworzyć nową bitmapę od zera. – harism

+0

Właściwie, istnieje jedna opcja jeśli -clause w obrębie 'createBitmap (...)', która zwraca tę samą mapę bitową, która jest podana jako parametr. Może twój kod trafia w tę dokładnie sprawę, tworząc 'scaledBitmap == rotatedBitmap'. [Bitmap.java] (http://www.java2s.com/Open-Source/Android/android-core/platform-frameworks-base/android/graphics/Bitmap.java.htm) – harism

+0

Myślę, że robisz coś złego tutaj. Linia kodu 'rotatedBitmap! = ScaledBitmap' da ci wartość true przez cały czas. Ponieważ porównujesz dwa obiekty i nie są one obiektami pierwotnymi. Tak więc dwa obiekty nie są sobie równe. – sampathpremarathna

Odpowiedz

3

createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)zwraca niezmienną bitmapę z podzbioru źródłowej bitmapy, przekształconą przez opcjonalną macierz.

Tworzenie metody Bitmap zwróci tę samą metodę Bitmap, który jest zaliczony, jeśli wszystkie następujące spełnia warunku

  • Jeśli sourceBitmap jest niezmienna i
  • piksel zaczyna się od 0,0 xy i
  • oczekiwana szerokość i wysokość jest taka sama jak oryginalna szerokość i wysokość oraz
  • macierz jest zerowa

w Android kodu źródłowego coś zostało napisane jak na poniższym

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

Zobacz kod źródłowy BitMap.java stąd

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

lub

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/graphics/Bitmap.java

Powiązane problemy