如何将Camera2 API设置为标准相机?

时间:2018-03-27 10:29:46

标签: android android-camera2

如果我通过Intent使用标准相机拍摄图像:

打开相机:

 val takePicture = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        if (takePicture.resolveActivity(packageManager) != null) {
            startActivityForResult(takePicture, TAKE_PICTURE)
        }

相机预览

Camera Preview

在ImageView上显示结果

Result Image View

如果我在以下位置使用Camera2 API:git:https://github.com/googlesamples/android-Camera2Basic 图像的结果不显示肖像

相机2预览

Camera2 Preview

在ImageView上显示结果

Image View

我的代码显示图片:

val bitmap = BitmapFactory.decodeFile(file.toString())
  imagePreview.setImageBitmap(bitmap)
                        }

如何设置Camera2 API以显示相同的标准相机?

1 个答案:

答案 0 :(得分:2)

在Camera2Basic示例中,ImageSaver不会针对设备方向旋转捕获的J​​PEG。相反,Camera2BasicFragment.captureStillPicture()设置CaptureRequest.JPEG_ORIENTATION,这只是相机固件的推荐

  

相机设备可以将此值编码为JPEG EXIF标题,也可以旋转图像数据以匹配此方向。旋转图像数据时,缩略图数据也将旋转。

大多数情况下,此推荐仅适用于'设置标题,但有些设备甚至错过了。请参阅最近article有关此功能及其可靠性的信息。

请注意,所有查看器软件都不会遵守EXIF方向标记,因此相机应用程序通常会将实际JPEG旋转到默认方向。

将捕获的图片加载到 ImageView 的代码当前会忽略此标记。您可以使用ExifInterface.getAttributeInt(TAG_ORIENTATION)从文件或输入流中提取方向。或者,如果捕获图像并立即显示,则可以直接从传感器获取设备方向。现在是时候决定相机是将图像存储为肖像(即宽度小于高度),还是作为风景,在这种情况下,您需要旋转它进行显示。不要根据此方向旋转位图。相反,您可以调用 imagePreview setImageMatrix()来正确显示图片。

顺便说一下,如果您只需要将JPEG传输到 ImageView ,请不要将JPEG解码为内存中的满刻度位图:这可能会消耗太多RAM。最简单的一行是改为呼叫setImageURI()