【发布时间】:2012-09-12 17:31:45
【问题描述】:
根据文档Bitmap createBitmap (Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter) 方法:
从源位图的子集中返回一个不可变位图, 由可选矩阵变换。新的位图可能是 与源相同的对象,或者可能已制作副本。它是 初始化为与原始位图相同的密度。如果 源位图是不可变的,请求的子集是 与源位图本身相同,则源位图为 返回并且没有创建新的位图。
我有一种方法可以将方向应用于现有位图:
private Bitmap getOrientedPhoto(Bitmap bitmap, int orientation) {
int rotate = 0;
switch (orientation) {
case ORIENTATION_ROTATE_270:
rotate = 270;
break;
case ORIENTATION_ROTATE_180:
rotate = 180;
break;
case ORIENTATION_ROTATE_90:
rotate = 90;
break;
default:
return bitmap;
}
int w = bitmap.getWidth();
int h = bitmap.getHeight();
Matrix mtx = new Matrix();
mtx.postRotate(rotate);
return Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
}
我从这里调用它:
Bitmap tmpPhoto = BitmapFactory.decodeFile(inputPhotoFile.getAbsolutePath(), tmpOpts);
Bitmap orientedPhoto = getOrientedPhoto(tmpPhoto, orientation);
我检查了tmpPhoto 是不可变的,但getOrientedPhoto() 仍然返回可变图像,它是 tmpPhoto 的副本。有谁知道如何在不创建新位图对象的情况下使用Bitmap.createBitmap(),我的代码有什么问题?
【问题讨论】:
-
我猜想当他的位图被矩阵转换时,总是会创建一个新对象。如果原件是不可变的,它怎么能改变原件呢?
-
我支持丹尼尔。这就是我从定义中读出的内容。只有当且仅当没有变化时,它才是相同的实例,即在无论如何都不需要调用的情况下。
-
您是否检查过
OrientedPhoto和isMutable ()方法以确保它是可变的? -
是的,我已经检查过了,它是可变的。我相信丹尼尔·费舍尔是对的。但我仍在努力寻找
createBitmap()的真正工作原理
标签: java android bitmap bitmapfactory