Android Camera2控制图像方向
我基于GoogleAndroid Camera2控制图像方向,android,camera,android-camera,android-camera2,Android,Camera,Android Camera,Android Camera2,我基于Googlecamera2sample创建了摄像头屏幕,所有代码几乎相同,摄像头拍摄照片并以JPEG格式保存在设备上,但我有一些奇怪的行为 例如,从emulator拍照将图像旋转90度(图像已旋转,而不是预览),在我的华为手机上,图像未旋转 奇怪的是,Emulator和华为的屏幕旋转和传感器方向值完全相同。 那么jpeg的方向是如何设置的呢 此外,在探索CaptureRequest.JPEG\u方向时 captureBuilder.set(CaptureRequest.JPEG_ORIEN
camera2
sample创建了摄像头屏幕,所有代码几乎相同,摄像头拍摄照片并以JPEG
格式保存在设备上,但我有一些奇怪的行为
例如,从emulator拍照将图像旋转90度(图像已旋转,而不是预览),在我的华为手机上,图像未旋转
奇怪的是,Emulator和华为的屏幕旋转和传感器方向值完全相同。
那么jpeg的方向是如何设置的呢
此外,在探索CaptureRequest.JPEG\u方向时
captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation))
我注意到,这种方法对Emulator根本没有影响
位图保存后,我曾尝试从ExifInterface
获取JPEG
方向,但在Emulator和华为中,该值均为orientation\u未定义
。可能在将图像
(从图像读取器
)转换为文件
Exif
标记时被忽略
也许我需要在拍摄图像时手动设置ExiFinInterface,但是如果值相同,那么区别是什么?
我们应该如何控制JPEG
方向
使用此方法获得方向(来自Google camera2示例),Emulator和华为的结果为90度
private int getOrientation(int rotation) {
return (ORIENTATIONS.get(rotation) + mSensorOrientation + 270) % 360;
}
使用此方法从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;
}
Emulator是使用Camera2 API的一个非常糟糕的起点。本质上,它支持传统的Camera2,但也有一些古怪之处 这就是说,Jpeg定位在Android摄像头上是一个非常微妙的话题。官方文件解释说,旋转请求可能适用于图像本身,也可能仅适用于EXIF标志,但一些设备(您测试了哪些华威?)根本不符合要求
另请注意,
BitmapFactory.decodeByteArray()
,.是的,我的主要问题和困惑是BitmapFactory.decodeByteArray()
忽略Exif
数据JPEG\U方向
的值似乎对我的像素3a上的实际数据也没有影响。有没有办法解决这个问题,或者至少有一种方法可以使图像旋转,而且成本不高,性能也不差?@DaveNottage这是一个令人悲哀的事实。我想知道安卓12平台的AVIF图像支持将如何帮助这一点。