我正在做一个应用程序,它使用相机拍摄照片,然后旋转并缩放它。 我需要旋转图像,因为相机返回错误的旋转图像,我需要缩放它以减小其大小。 我首先将临时目录保存在相机返回的原始图像中,然后我读取它并进行修改,将新图像保存到新文件中。 我尝试过使用矩阵来旋转和缩放图片,但它失去了质量。 然后我试着用Bitmap.createScaledBitmap先缩放它,然后用矩阵旋转它,但结果甚至比仅使用矩阵的结果更丑。 然后我试着先旋转它,然后使用总是Bitmap.createScaledBitmap来调整它的大小。图像不会丢失质量,但是在旋转图像后缩放它并将宽度和高度反转后,图像就会被拉伸。也尝试根据所做的旋转反转高度和宽度,但它又失去了质量。 这是我写的最后一段代码:Android - 缩放,旋转并将位图保存到SD卡而不会丢失质量
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中,它不会丢失质量,只是在将它保存到文件时丢失了质量。
问题与'Bitmap.CompressFormat.PNG'就是文件每次旋转时都会变大。 –