【发布时间】:2013-07-04 14:27:07
【问题描述】:
我正在做一个应用程序,它用相机拍照,然后旋转和缩放它。 我需要旋转图像,因为相机返回错误的旋转图像,我需要对其进行缩放以减小其大小。 我首先将相机返回的原始图像保存在临时目录中,然后读取并进行修改,将新图像保存到新文件中。 我尝试使用矩阵来旋转和缩放图片,但质量下降。 然后我尝试先用 Bitmap.createScaledBitmap 缩放它,然后用矩阵旋转它,但结果比只使用矩阵的更难看。 然后我尝试先旋转它,然后始终使用 Bitmap.createScaledBitmap 调整它的大小。图像不会损失质量,但是在旋转后缩放它并且宽度和高度反转时它被拉伸了。还尝试根据旋转来反转高度和宽度,但它再次失去了质量。 这是我写的最后一个代码:
in= new FileInputStream(tempDir+"/"+photo1_path);
out = new FileOutputStream(file+"/picture.png");
Bitmap src = BitmapFactory.decodeStream(in);
int iwidth = src.getWidth();
int iheight = src.getHeight();
int newWidth = 0;
int newHeight = 0;
newWidth = 800;
newHeight = 600;
// calculate the scale - in this case = 0.4f
float scaleWidth = ((float) newWidth) / iwidth;
float scaleHeight = ((float) newHeight) / iheight;
// createa matrix for the manipulation
Matrix matrix = new Matrix();
// resize the bit map
//matrix.postScale(scaleWidth, scaleHeight);
int orientation = getOrientation(MyActivity.this,Uri.parse(tempDir+"/"+photo1_path));
switch(orientation) {
case 3:
orientation = 180;
break;
case 6:
orientation = 90;
break;
case 8:
orientation = 270;
break;
}
int rotate = 0;
switch(orientation) {
case 90:
rotate=90;
break;
case 180:
rotate=180;
break;
case 270:
rotate=270;
break;
}
// rotate the Bitmap
matrix.postRotate(rotate);
src =Bitmap.createScaledBitmap(src , newWidth, newHeight, false);
// recreate the new Bitmap
Bitmap new_bit = Bitmap.createBitmap(src, 0, 0,
src.getWidth(), src.getHeight(), matrix, true);
new_bit.compress(Bitmap.CompressFormat.PNG, 100, out);
有什么建议吗?
编辑:如果我只旋转或只缩放图像,它不会损失质量。当我同时做这两件事时,图像质量就会下降。另外,如果我在调整大小和缩放后将图像放入 ImageView 中,它不会丢失质量,只是当我将其保存到文件时会丢失质量。
【问题讨论】:
标签: android matrix bitmap rotation