确保以与拍摄时相同的方向保存照片?

2022-09-04 23:38:20

出于某种原因,我的相机应用程序保存所有旋转90度的照片(照片只有在使用相机在横向模式下拍摄时才看起来正确)我相信在PictureTaken上应该自动旋转照片,但我读到三星设备有问题(我无法在其他品牌上进行测试,所以我不知道是否是这种情况)。这是我的代码:

   public void onPictureTaken(byte[] data, Camera camera) {
      // Generate file name
      FileOutputStream outStream = null;
      outStream = new FileOutputStream(filePath);
      outStream.write(data);
      outStream.close();

我认为可以通过检查方向和旋转字节数组来修复它,但是必须有一种更直接的方法可以做到这一点,因为处理字节数组是一种痛苦。如何确保照片的保存方向与拍摄方向相匹配?


答案 1

试试下面这样:

int orientation = Exif.getOrientation(data);
Log.d("#", "onPictureTaken().orientation = " + orientation);
if(orientation != 0) {
     Bitmap bmpSrc = BitmapFactory.decodeByteArray(data, 0, data.length);
     Bitmap bmpRotated = CameraUtil.rotate(bmpSrc, orientation);
     bmpSrc.recycle();


       try {

             FileOutputStream localFileOutputStream = new FileOutputStream(filePath);
             bmpRotated.compress(Bitmap.CompressFormat.JPEG, 90,localFileOutputStream);
             localFileOutputStream.flush();
             localFileOutputStream.close();
             bmpRotated.recycle();

           }
        catch (FileNotFoundException e) 
           {
              e.printStackTrace();
           }
        catch (IOException e) 
           {
               e.printStackTrace();
           }

      } else {

          try {

               FileOutputStream localFileOutputStream = new FileOutputStream(filePath);
               localFileOutputStream.write(data);
               localFileOutputStream.flush();
               localFileOutputStream.close();

               } catch (IOException localIOException)
                  {
                                        Log.e("#",localIOException.getMessage());
                  }
   }

答案 2

有不同的方法来获取图像,作为数据,作为流,作为文件,对于相机和图库以及其他应用程序也是不同的。对于它们中的每一个,您都有另一种方式来访问方向标记。获得方向后,您可以旋转图像。

你 - 或者就此而言,每个人都 - 应该真正获得一个Nexus,它们很好,可以为您旋转图像并将方向设置为0,而像三星这样的懒惰者只是存储图像并设置方向标签。;)


推荐