[英]why a captured image bitmap from Android camera is rotated
我正在使用 IMAGE_CAPTURE 相机意图来捕捉和成像,并使用 MediaStore.EXTRA_OUTPUT 将其存储在文件中。 当我在 onActivityResult 中收到图像时,旋转 bitmap。
请就如何解决此问题提出任何建议。
意图并将 uri 传递到我想要存储文件的位置
private fun capturePhoto() {
val capturedImage = File(this.requireContext().externalCacheDir, "utility_bill.jpg")
if (capturedImage.exists()) {
capturedImage.delete()
}
capturedImage.createNewFile()
mUri = if (Build.VERSION.SDK_INT >= 24) {
FileProvider.getUriForFile(
this.requireContext(),
this.requireContext().applicationContext.packageName,
capturedImage
)
} else {
Uri.fromFile(capturedImage)
}
val intent = Intent("android.media.action.IMAGE_CAPTURE")
intent.putExtra(MediaStore.EXTRA_OUTPUT, mUri)
startActivityForResult(intent, CAMERA_REQUEST_CODE)
}
在 onActivityResult bitmap 中旋转。
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
hideScreen.visibility = View.GONE
if (resultCode == Activity.RESULT_OK && requestCode == CAMERA_REQUEST_CODE) {
uploadedImageCount++
val bitmap = BitmapFactory.decodeStream(
this.requireContext().contentResolver.openInputStream(mUri!!)
)
}}
当我调试代码中收到的 bitmap 时,它被旋转了
请就我如何解决这个问题提出任何建议
提前致谢 R
我在开发应用程序时遇到了同样的问题,三星、HTC 和某些设备等设备就是这种情况....这是因为 Exif 接口与上面提到的设备不同所以单独制作一个 Java class ExifUtil .java代码如下所示注意此代码位于 Java
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.os.Build;
public class ExifUtil {
/**
// * @see https://sylvana.net/jpegcrop/exif_orientation.html
*/
public static Bitmap rotateBitmap(String src, Bitmap bitmap) {
try {
int orientation = getExifOrientation(src);
if (orientation == 1) {
return bitmap;
}
Matrix matrix = new Matrix();
switch (orientation) {
case 2:
matrix.setScale(-1, 1);
break;
case 3:
matrix.setRotate(180);
break;
case 4:
matrix.setRotate(180);
matrix.postScale(-1, 1);
break;
case 5:
matrix.setRotate(90);
matrix.postScale(-1, 1);
break;
case 6:
matrix.setRotate(90);
break;
case 7:
matrix.setRotate(-90);
matrix.postScale(-1, 1);
break;
case 8:
matrix.setRotate(-90);
break;
default:
return bitmap;
}
try {
Bitmap oriented = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
bitmap.recycle();
return oriented;
} catch (OutOfMemoryError e) {
e.printStackTrace();
return bitmap;
}
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
private static int getExifOrientation(String src) throws IOException {
int orientation = 1;
try {
/**
* if your are targeting only api level >= 5
* ExifInterface exif = new ExifInterface(src);
* orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
*/
if (Build.VERSION.SDK_INT >= 5) {
Class<?> exifClass = Class.forName("android.media.ExifInterface");
Constructor<?> exifConstructor = exifClass.getConstructor(new Class[] { String.class });
Object exifInstance = exifConstructor.newInstance(new Object[] { src });
Method getAttributeInt = exifClass.getMethod("getAttributeInt", new Class[] { String.class, int.class });
Field tagOrientationField = exifClass.getField("TAG_ORIENTATION");
String tagOrientation = (String) tagOrientationField.get(null);
orientation = (Integer) getAttributeInt.invoke(exifInstance, new Object[] { tagOrientation, 1});
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return orientation;
}
}
和 OnActivityResult 像这样保存它 Bitmap orientedBitmap = ExifUtil.rotateBitmap(img_path, myBitmap);
this will automatically determine the orientation of the mage and rotate it to Potrait...!!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.