我构建了一个自定义相机活动,用户可以在其中拍照。图片通过图片回调保存在外部存储目录中。然后,用户被重定向到另一个可以预览图片的活动。在显示预览之前,图片将按照单独的线程缩小到某个最大尺寸。这是缩放代码:
byte[] tempStorage = new byte[16 * 1024];
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imagePath, options);
int oldWidth = options.outWidth;
int oldHeight = options.outHeight;
if (oldWidth > MAX_DIM || oldHeight > MAX_DIM) {
Logger.i(Constants.SCALE_TAG, "Must scale picture");
int scaleFactor = getScaleFactor(oldWidth, oldHeight);
options.inJustDecodeBounds = false;
options.inSampleSize = scaleFactor;
options.inTempStorage = tempStorage;
System.gc();
newB = BitmapFactory.decodeFile(imagePath, options);
} else {
Logger.i(Constants.SCALE_TAG, "No need for scaling");
// We do not need to scale the picture, it is small
// enough.
System.gc();
options.inJustDecodeBounds = false;
options.inTempStorage = tempStorage;
if (!stop) {
newB = BitmapFactory.decodeFile(imagePath, options);
} else {
return;
}
}
以下是计算比例因子的代码:
private int getScaleFactor(int oldWidth, int oldHeight) {
// Holds the raw scale factor.
float rawScale;
// Get the scaling factor.
if (oldWidth >= oldHeight) {
rawScale = 1.0F / ((MAX_DIM * 1.0F) / (oldWidth * 1.0F));
} else {
rawScale = 1.0F / ((MAX_DIM * 1.0F) / (oldHeight * 1.0F));
}
Logger.i(Constants.SCALE_TAG, "Raw scale factor: " + rawScale);
return Math.round(rawScale);
}
此代码在大多数设备上都能正常工作,但不知何故,Desire HD无法正确缩放图片。它看起来像是拍摄了原始照片并将其复制了三十次左右并将其瞄准了Bitmap,从而产生了奇怪的条纹图像。有谁知道这个问题?
答案 0 :(得分:0)
你应该使用更少的内存。问题是你使用的内存太多了。