代码之家  ›  专栏  ›  技术社区  ›  pamobo0609

拍照时如何获取设备方向

  •  0
  • pamobo0609  · 技术社区  · 7 年前

    我从来没有像今天这样在图像上挣扎过,我希望能得到一些帮助:d
    所以,问题是,我正在使用内置相机拍摄一张照片,然后将其发送到后端保存,但方向是混乱的 Kit kat 特别是 Samsung 设备。我试着使用 exif 界面每个人都建议,但我就是不能得到照片的方向。
    几分钟前,我找到了一个与此相关的答案,说可能一个好的解决方案是在拍照时保存设备方向,这听起来很不错,但是,我不知道如何使用内置摄像头做到这一点,因为我无法完全控制使用 Intent ,如下所示:

    mPathToTakenImage = ImageProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider",
                newFile);
    
        openCamera.putExtra(MediaStore.EXTRA_OUTPUT, mPathToTakenImage);
        openCamera.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    
        startActivityForResult(openCamera, AlgebraNationConstants.TAKE_PHOTO_REQUEST_CODE);
    

    那么,如何在拍摄图像时获得设备方向,以便正确旋转图像?
    这是旋转图像的代码,然而,我总是得到零:

            final Bitmap finalImg;
            final StringBuilder base64Image = new StringBuilder("data:image/jpeg;base64,");
    
            final ExifInterface exifInterface;
    
            try {
                final String imagePath = params[0].getPath();
    
                exifInterface = new ExifInterface(imagePath);
    
                final int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                        ExifInterface.ORIENTATION_UNDEFINED);
    
                final Bitmap takenPhoto = MediaStore.Images.Media.getBitmap(mRelatedContext.getContentResolver(),
                        params[0]);
    
                if (null == takenPhoto) {
                    base64Image.setLength(0);
                } else {
                    finalImg = rotateBitmap(takenPhoto, orientation);
    
                    if (null == finalImg) {
                        base64Image.setLength(0);
                    } else {
                        final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                        finalImg.compress(Bitmap.CompressFormat.JPEG, 75, byteArrayOutputStream);
                        final byte[] byteArray = byteArrayOutputStream.toByteArray();
                        base64Image.append(Base64.encodeToString(byteArray, Base64.DEFAULT));
                    }
                }
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return base64Image.length() == 0 ? null : base64Image.toString();
    


    编辑:
    <code>exiftool</code> data from the picture I'm using, which is in landscape mode

    2 回复  |  直到 7 年前
        1
  •  0
  •   CommonsWare    7 年前

    A. Uri 不是文件。除非 Uri file , getPath() 毫无意义。在你的情况下,该计划主要是 content 文件 . 目前,您没有收到EXIF标头,因为 ExifInterface 找不到该文件。

    使用 ContentResolver openInputStream() 打开 InputStream 关于 Uri . 传递那个 输入流 the android.support.media.ExifInterface constructor .

    OutOfMemoryError ,因为您将没有堆空间来保存base64编码的照片。

        2
  •  0
  •   pamobo0609    7 年前

    因此,我最终利用这两个答案解决了我的问题:

    https://stackoverflow.com/a/17426328

    https://stackoverflow.com/a/40865982

    一般来说,问题是由于磁盘中的映像分配,因为我不知道为什么 Android 我不喜欢这样一个事实,那就是我正在给自己的路径来保存拍摄的图像。最后 Intent 打开摄像机的步骤如下:
    final Intent openCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(openCamera, AlgebraNationConstants.TAKE_PHOTO_REQUEST_CODE);

    它本身正在解决图像放置的位置。然而,@commonware感谢您的启发和回答。