为什么有时Bitmaps是相同的对象?

时间:2011-12-01 10:39:27

标签: java android matrix bitmap

在我的代码中,我正在做这样的事情:

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) {时,我在使用回收的Bitmap方面遇到了错误。

Android是否会在每次Bitmap.createBitmap来电时创建新的位图,如何避免位图之间的比较?

1 个答案:

答案 0 :(得分:3)

createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter) 从源位图的子集返回不可变位图,由可选矩阵转换。

创建BitMap方法将返回相同的Bitmap方法,如果以下所有条件满足

,则会传递该方法
  • 如果您的sourceBitmap是不可变的
  • 像素从0,0 x-y和
  • 开始
  • 预期的宽度和高度与原始宽度和高度相同
  • 矩阵为空

在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