我制作了一个使用Google Camera2 sample拍摄照片(肖像,风景或自拍照)的应用程序。一切正常,我可以拍照,保存,等等。
但是当我打开手机(三星S7)库时,所有自拍和肖像照片都会旋转90度。虽然景观图片很好。我已经看过很多关于如何以正确的方向读取图像的帖子,但是如何妥善保存它们呢?
我的应用程序中有自己的图库,并且图片正确加载(使用Glide),没有任何特殊的旋转修复,所以我不确定我做错了什么,最重要的是,我该如何解决这个问题?
答案 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
Uri
,content
Uri
,{{ 1}} URL)。这是因为他们可以访问结果https
的EXIF标记和,因此他们可以告诉ImageView
旋转图像。
然而,并非每个人都使用这样的库。 ImageView
自行处理ImageView
之类的内容,其中EXIF代码在解码过程中丢失了。
作为相机应用的作者,您有两个主要选项:
您可以检查EXIF标签,看到图像需要旋转,自己旋转图像,并保存旋转的图像(删除方向标签,但安排保留其他标签)。但是,这可能会失败Bitmap
,尤其是相机图像,因为这些图像往往很大。
你可以耸耸肩膀继续前进,因为它不是你的问题。正如您所注意到的,其他图库应用程序没有出现此问题,因为它们已经过充分测试,而您尝试过的原始图库应用程序却没有。
如果你使用选项#1,如果你得到OutOfMemoryError
,它会变成选项#2。