gpt4 book ai didi

java - 为什么有时位图是相同的对象?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:58:43 24 4
gpt4 key购买 nike

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

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 时创建新的位图?如何避免位图之间的比较?

最佳答案

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

如果以下所有条件都满足,Create 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

关于java - 为什么有时位图是相同的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8339962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com