如果我通过Intent使用标准相机拍摄图像:
打开相机:
val takePicture = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
if (takePicture.resolveActivity(packageManager) != null) {
startActivityForResult(takePicture, TAKE_PICTURE)
}
相机预览
在ImageView上显示结果
如果我在以下位置使用Camera2 API:git:https://github.com/googlesamples/android-Camera2Basic
图像的结果不显示肖像
相机2预览
在ImageView上显示结果
我的代码显示图片:
val bitmap = BitmapFactory.decodeFile(file.toString())
imagePreview.setImageBitmap(bitmap)
}
如何设置Camera2 API以显示相同的标准相机?
答案 0 :(得分:2)
在Camera2Basic示例中,ImageSaver不会针对设备方向旋转捕获的JPEG。相反,Camera2BasicFragment.captureStillPicture()设置CaptureRequest.JPEG_ORIENTATION,这只是相机固件的推荐。
相机设备可以将此值编码为JPEG EXIF标题,也可以旋转图像数据以匹配此方向。旋转图像数据时,缩略图数据也将旋转。
大多数情况下,此推荐仅适用于'设置标题,但有些设备甚至错过了。请参阅最近article有关此功能及其可靠性的信息。
请注意,所有查看器软件都不会遵守EXIF方向标记,因此相机应用程序通常会将实际JPEG旋转到默认方向。
将捕获的图片加载到 ImageView 的代码当前会忽略此标记。您可以使用ExifInterface.getAttributeInt(TAG_ORIENTATION)从文件或输入流中提取方向。或者,如果捕获图像并立即显示,则可以直接从传感器获取设备方向。现在是时候决定相机是将图像存储为肖像(即宽度小于高度),还是作为风景,在这种情况下,您需要旋转它进行显示。不要根据此方向旋转位图。相反,您可以调用 imagePreview 。setImageMatrix()来正确显示图片。
顺便说一下,如果您只需要将JPEG传输到 ImageView ,请不要将JPEG解码为内存中的满刻度位图:这可能会消耗太多RAM。最简单的一行是改为呼叫setImageURI()。