Android Camera2图片在图库中旋转显示

时间:2017-07-01 17:26:39

标签: android android-camera2

我制作了一个使用Google Camera2 sample拍摄照片(肖像,风景或自拍照)的应用程序。一切正常,我可以拍照,保存,等等。

但是当我打开手机(三星S7)库时,所有自拍和肖像照片都会旋转90度。虽然景观图片很好。我已经看过很多关于如何以正确的方向读取图像的帖子,但是如何妥善保存它们呢?

我的应用程序中有自己的图库,并且图片正确加载(使用Glide),没有任何特殊的旋转修复,所以我不确定我做错了什么,最重要的是,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您是否在静态捕获请求中使用JPEG_ORIENTATION控件?如果没有,那可能是问题 - 控制告诉摄像机设备如何将最终的JPEG图像旋转为正面朝上。

因此,您需要更新该控件中的值,以描述图像传感器当前如何相对于世界排列。

要进行该计算,您需要来自加速度计的输入(告诉您哪个方向已关闭),然后是一些基本数学 - 从上面的链接再现:

private int getJpegOrientation(CameraCharacteristics c, int deviceOrientation) {
  if (deviceOrientation == android.view.OrientationEventListener.ORIENTATION_UNKNOWN) return 0;
  int sensorOrientation = c.get(CameraCharacteristics.SENSOR_ORIENTATION);

  // Round device orientation to a multiple of 90
  deviceOrientation = (deviceOrientation + 45) / 90 * 90;

  // Reverse device orientation for front-facing cameras
  boolean facingFront = c.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT;
  if (facingFront) deviceOrientation = -deviceOrientation;

  // Calculate desired JPEG orientation relative to camera orientation to make
  // the image upright relative to the device orientation
  int jpegOrientation = (sensorOrientation + deviceOrientation + 360) % 360;

  return jpegOrientation;
}

输入deviceOrientation来自传感器API。

答案 1 :(得分:-1)

图像查看器应检查EXIF标签并根据方向标签旋转图像。这允许相机应用程序和类似软件以任何方向保存图像,而无需在保存之前旋转图像。

像Glide和Picasso这样的图书馆会为你做这件事,如果你让他们访问完整的JPEG(例如file Uricontent Uri,{{ 1}} URL)。这是因为他们可以访问结果https的EXIF标记,因此他们可以告诉ImageView旋转图像。

然而,并非每个人都使用这样的库。 ImageView自行处理ImageView之类的内容,其中EXIF代码在解码过程中丢失了。

作为相机应用的作者,您有两个主要选项:

  1. 您可以检查EXIF标签,看到图像需要旋转,自己旋转图像,并保存旋转的图像(删除方向标签,但安排保留其他标签)。但是,这可能会失败Bitmap,尤其是相机图像,因为这些图像往往很大。

  2. 你可以耸耸肩膀继续前进,因为它不是你的问题。正如您所注意到的,其他图库应用程序没有出现此问题,因为它们已经过充分测试,而您尝试过的原始图库应用程序却没有。

  3. 如果你使用选项#1,如果你得到OutOfMemoryError,它会变成选项#2。