Почему иногда растровые изображения являются одними и теми же объектами? - PullRequest
5 голосов
/ 01 декабря 2011

В моем коде я делаю что-то вроде этого:

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 вызове и как можно избежать сравнения растровых изображений?

1 Ответ

3 голосов
/ 01 декабря 2011

createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter) возвращает неизменное растровое изображение из подмножества исходного растрового изображения, преобразованное необязательной матрицей.

Метод Create BitMap возвращает тот же метод битовой картыкоторый передается, если все следующие условия удовлетворяют

  • Если ваш sourceBitmap является неизменным и
  • пиксель начинается с 0,0 xy и
  • ожидаемая ширина и высота такие же, как у оригинальной ширины и высоты, и
  • матрица равна нулю

В исходном коде Android написано что-то вроде следующего

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

См. Исходный код BitMap.java здесь

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

или

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...