相机意图自动旋转至90度

7
在我下面的代码中,我正在尝试使用本机相机拍照并上传到服务器,但是当我将其作为肖像照片拍摄并在图库中查看时,它会被旋转90度成为横向照片。请帮忙解决问题:-
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

startActivityForResult(intent, REQUEST_CAMERA);

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK) {
        if (requestCode == REQUEST_CAMERA) {

            handleCameraPhoto();
}
private void handleCameraPhoto() {
    Intent mediaScanIntent = new Intent(
            "android.intent.action.MEDIA_SCANNER_SCAN_FILE");
    File f = new File(mCurrentPhotoPath);
    Uri contentUri = Uri.fromFile(f);

    mediaScanIntent.setData(contentUri);
    getActivity().sendBroadcast(mediaScanIntent);
}

如何在保存到SD卡之前旋转图像?


1
请注意,一些 Android 设备拍摄纵向照片并将其保存为纵向方向,而一些 Android 设备拍摄纵向照片并将其保存为横向方向,并添加旋转信息到 EXIF 元数据中以指示它们实际上是纵向的。(请参见 https://dev59.com/XHA65IYBdhLWcg3wxBir#3648017)。您需要弄清楚正在发生什么,并在必要时进行更正。(如果您可以修复服务器以注意 EXIF 旋转数据,则可能无需在设备上进行任何更正。) - Matt Gibson
@MattGibson 我还是不明白。那么我最好什么都不做吗?我是 Android 新手。我只是参考链接,然后如何将其合并到我的代码中呢? - micky
请参考以下链接中的答案:https://dev59.com/3WYq5IYBdhLWcg3w8VG8 - Shirish Herwade
2个回答

24

在显示列表视图中的图像时,我也遇到了这种问题。但是使用EXIF数据,我能够得到解决方案来正确设置图像的方向。

以下是准备用于显示的位图对象的位置:

  Matrix matrix = new Matrix();
  matrix.postRotate(getImageOrientation(url));
  Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
  bitmap.getHeight(), matrix, true);

这是在上面代码的第2行使用的方法,用于旋转图像方向。

 public static int getImageOrientation(String imagePath){
     int rotate = 0;
     try {

         File imageFile = new File(imagePath);
         ExifInterface exif = new ExifInterface(
                 imageFile.getAbsolutePath());
         int orientation = exif.getAttributeInt(
                 ExifInterface.TAG_ORIENTATION,
                 ExifInterface.ORIENTATION_NORMAL);

         switch (orientation) {
         case ExifInterface.ORIENTATION_ROTATE_270:
             rotate = 270;
             break;
         case ExifInterface.ORIENTATION_ROTATE_180:
             rotate = 180;
             break;
         case ExifInterface.ORIENTATION_ROTATE_90:
             rotate = 90;
             break;
         }
     } catch (IOException e) {
         e.printStackTrace();
     }
    return rotate;
 }

这可能不是你问题的精确答案,但对我有用,希望对你也有用。


我还有一个问题。如果我想在保存到SD卡之前旋转捕获的照片,应该把这段代码放在哪里?放在onActivityResult里面吗? - micky
通过流保存字节数组是将任何图像保存到SD卡的基本操作,这也是为什么使用ExifInterface类来保存方向、位置等数据的原因。我尝试了你提到的方法,但是没有成功。在我的观点里,尽可能保持以上代码来显示ImageViews(因为那是你最常使用图像的地方)。 - Shail Adi
这对我有用!我测试了三星Galaxy Y姜饼和三星Galaxy S3冰淇淋三明治。这在所有运行Android的手机型号上都有效吗?非常感谢。 :) - KarenAnne
这里的变量bitmap是什么? - Shajeel Afzal
这里的变量url是什么?因为我在这里不需要涉及url。只需将图库照片复制到sdcard中并旋转即可。@ShailAdi - Narendra Singh

2
Matrix matrix=new Matrix();
imageView.setScaleType(ScaleType.MATRIX);   //required
matrix.postRotate((float) angle, pivX, pivY);
imageView.setImageMatrix(matrix);



This method does not require creating a new bitmap each time.. Hope this works.

更多帮助请访问以下链接...https://dev59.com/gWox5IYBdhLWcg3ww3GV - AKSH
3
当你复制并粘贴别人的答案时,请注明出处! - Alexander Vogt
@Amit 如果我使用postRotate将它旋转90度,所有手机都会生效吗?因为我在HTC上测试过了,可以正常工作,不需要为三星手机进行旋转。如果我有误,请纠正我。 - micky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接