【发布时间】:2013-11-01 17:55:00
【问题描述】:
我需要从文件加载图像到 ImageView 上画一些东西并保存到同一个文件。我的所有修改都绘制在名为mCanvasView 的单独视图中。这是我的保存代码:
private void saveResult() {
OutputStream stream = null;
try {
Bitmap result;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inMutable = true;
result = BitmapFactory.decodeFile(mFilePath, options);
} else {
Bitmap bitmap = BitmapFactory.decodeFile(mFilePath);
result = bitmap.copy(Bitmap.Config.ARGB_8888, true);
bitmap.recycle();
}
float resultWidth = result.getWidth();
float resultHeight = result.getHeight();
Canvas canvas = new Canvas(result);
Bitmap overlay = mCanvasView.getDrawingCache();
Matrix matrix = new Matrix();
matrix.setScale(resultWidth / overlay.getWidth(), resultHeight
/ overlay.getHeight());
canvas.drawBitmap(overlay, matrix, new Paint());
stream = new FileOutputStream(mFilePath);
result.compress(CompressFormat.PNG, 100, stream);
} catch (Exception e) {
e.printStackTrace();
leaveActivityWithMissingData();
} finally {
IOUtils.closeQuietly(stream);
}
}
首先 - 它真的很慢。我不明白为什么。其次,如果图像以纵向模式拍摄,则保存的图像将被旋转。为什么?我不应用任何轮换。
我已经像这样修改了我的代码以使用来自 EXIF 的旋转数据:
OutputStream stream = null;
try {
Bitmap original;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inMutable = true;
original = BitmapFactory.decodeFile(mFilePath, options);
} else {
Bitmap bitmap = BitmapFactory.decodeFile(mFilePath);
original = bitmap.copy(Bitmap.Config.ARGB_8888, true);
bitmap.recycle();
}
int resultWidth = original.getWidth();
int resultHeight = original.getHeight();
int rotation = Utils.getRotation(mFilePath);
if (rotation % 180 != 0) {
resultHeight = original.getWidth();
resultWidth = original.getHeight();
}
Bitmap result = Bitmap.createBitmap(resultWidth, resultHeight,
Config.ARGB_8888);
Canvas canvas = new Canvas(result);
Matrix rotationMatrix = new Matrix();
rotationMatrix.setRotate(rotation, resultWidth / 2,
resultHeight / 2);
canvas.drawBitmap(original, rotationMatrix, new Paint());
original.recycle();
Bitmap overlay = mCanvasView.getDrawingCache();
Matrix scaleMatrix = new Matrix();
scaleMatrix.setScale(resultWidth / overlay.getWidth(), resultHeight
/ overlay.getHeight());
canvas.drawBitmap(overlay, scaleMatrix, new Paint());
overlay.recycle();
stream = new FileOutputStream(mFilePath);
result.compress(CompressFormat.PNG, 100, stream);
result.recycle();
} catch (Exception e) {
e.printStackTrace();
leaveActivityWithMissingData();
} finally {
IOUtils.closeQuietly(stream);
}
但这会导致每次调用都出现 OOM。我究竟做错了什么?
【问题讨论】:
-
对性能没有真正的评论,但您可能需要检查stackoverflow.com/questions/4374141
标签: android image-processing bitmap