我使用Camera意图捕获android上的照片,当onActivityResult的意图返回位图时,它在某些手机上的方向错误。 我知道有办法解决这个问题,但我见过的所有解决方案都谈到了存储在文件中的图像。 我从意图中检索的是直接位图图像。我想知道如何获取位图的exif数据,然后更正其方向。我再说一遍,我已经看到了处理文件而不是位图的答案,所以请在投票之前考虑一下。
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takePictureIntent, Constants.CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}
结果如下
Bundle extras = data.getExtras();
Bitmap imageBitmap = (Bitmap) extras.get("data");
如何获得方向并旋转它。
答案 0 :(得分:0)
<强>更新强>
Exif是一种将一些信息数据插入JPEG的文件格式。 https://www.media.mit.edu/pia/Research/deepview/exif.html
Bitmap
是数据结构数据保存行像素数据,没有exif信息
所以我认为从Bitmap
获取exif信息是不可能的
没有方法可以获取exif信息
https://developer.android.com/reference/android/graphics/Bitmap.html
<强> ORIGINAL 强>
我同意@DzMobNadjib。 我认为旋转的信息只是exif。 要采取exif,我建议您采取以下步骤。
<强> 1。使用文件路径启动相机活动。
参见 [保存全尺寸照片] 捕捉this document。
您可以使用文件路径启动相机活动。相机活动会将图像保存到您传递的文件路径中。
<强> 2。在&#39; onActivityResult&#39;中,关注this answer (如@DzMobNadjib建议的那样)
您的代码将是这样的:
(对不起,我没有经过测试。请仔细阅读并按照上述答案)
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
if (requestCode == Constants.CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
Uri uri = data.getData();
Bitmap bitmap = getAdjustedBitmap(uri);
}
}
}
private Bitmap getAdjustedBitmap(Uri uri) {
FileInputStream is = null;
try {
ExifInterface exif = new ExifInterface(uri.getPath());
int rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
int rotationInDegrees = exifToDegrees(rotation);
Matrix matrix = new Matrix();
if (rotation != 0f) {
matrix.preRotate(rotationInDegrees);
}
is = new FileInputStream(new File(uri.getPath()));
Bitmap sourceBitmap = BitmapFactory.decodeStream(is);
int width = sourceBitmap.getWidth();
int height = sourceBitmap.getHeight();
return Bitmap.createBitmap(sourceBitmap, 0, 0, width, height, matrix, true);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
}
}
}
return null;
}
private static int exifToDegrees(int exifOrientation) {
if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) { return 90; }
else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) { return 180; }
else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) { return 270; }
return 0;
}