在我的代码中,我正在做这样的事情:
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
来电时创建新的位图,如何避免位图之间的比较?
答案 0 :(得分:3)
createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
从源位图的子集返回不可变位图,由可选矩阵转换。
创建BitMap方法将返回相同的Bitmap方法,如果以下所有条件满足
,则会传递该方法在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
或