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

Posted

技术标签:

【中文标题】确保照片以与拍摄时相同的方向保存?【英文标题】:Make sure photos are saved with the same orientation they were taken? 【发布时间】:2013-01-11 11:15:10 【问题描述】:

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

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

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

【问题讨论】:

查看类似问题here。 我已经看到了那个答案。我刚刚下载了他提供的源代码,它实际上不是用于相机应用程序,而是用于使用默认相机拍照。我根本不明白如何在答案上实现代码。有一个我没有的位图变量。如果您知道如何在 onPictureTaken 中包含答案,我会接受答案。 【参考方案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,而像三星这样的懒惰的人只是存储图像并设置方向标签。 ;)

【讨论】:

以上是关于确保照片以与拍摄时相同的方向保存?的主要内容,如果未能解决你的问题,请参考以下文章

从 Ipad 拍摄的照片将在服务器上反转

使用 OpenCV Python 以与参考图像相同的方向和尺寸转换和显示裁剪图像

如何拍摄与预览尺寸相同纵横比的照片?

以纵向拍摄的照片正在以横向保存

Android:保存用户使用相机拍摄的照片

如何调整人像照片头顶到照片边框距离?