我基于Google camera2
示例创建了相机屏幕,所有代码几乎相同,相机拍摄并以JPEG
格式将其保存在设备上,但是我有些奇怪的行为。
例如,从仿真器拍照将图像旋转90度(图像旋转,而不是预览),在我的华为上,图像未旋转。
奇怪的是,[[屏幕旋转和传感器方向值在Emulator和Huawei上都相同。那么如何精确设置jpeg方向?
也在探索CaptureRequest.JPEG_ORIENTATION
时captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation))
我注意到。我尝试在保存位图后从此方法对仿真器完全没有影响
JPEG
获取ExifInterface
方向,但是在Emulator和Huawei中,该值为ORIENTATION_UNDEFINED
。也许在将Image
(从ImageReader
)转换为File
Exif
标签时被忽略了?也许我在拍摄图像时需要手动设置ExifInterface,但是如果值相同,有什么区别?我们应该如何控制JPEG
方向?
使用此方法(从Google camera2示例获得方向)结果对于Emulator和Huawei是90度。
private int getOrientation(int rotation) {
return (ORIENTATIONS.get(rotation) + mSensorOrientation + 270) % 360;
}
使用此方法从Bitmap
获得ImageReader
public static Bitmap getBitmapFromReader(ImageReader reader) { Bitmap bitmap = null; Image image = null; try { image = reader.acquireLatestImage(); Image.Plane[] planes = image.getPlanes(); ByteBuffer buffer = planes[0].getBuffer(); buffer.rewind(); byte[] data = new byte[buffer.capacity()]; buffer.get(data); bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); } catch (Exception e) { e.printStackTrace(); } if (image != null) { image.close(); } return bitmap; }
这就是说,Jpeg方向在Android相机上是一个非常微妙的话题。官方文档解释说,旋转请求可能仅适用于图像本身,也可能仅适用于EXIF标志,但某些设备(您测试过Huawai吗?)根本不符合要求。
还要注意BitmapFactory.decodeByteArray()
ignores the EXIF flag,since the very beginning。