我创建了基于Google camera2样例的摄像头屏幕,所有代码几乎相同,相机拍摄照片并以JPEG格式保存在设备上,但我有一些奇怪的行为。
例如,从仿真器拍摄的照片使图像旋转90度(图像旋转,而不是预览),在我的华为上,图像没有旋转。
奇怪的是,屏幕旋转和传感器定位值在模拟器和华为上都是相同的。那么,jpeg方向究竟是如何设置的呢?
在探索CaptureRequest.JPEG_ORIENTATION的同时
captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation))我注意到这种方法对仿真程序没有任何影响,在所有的。
在保存位图后,我一直试图从JPEG中获得ExifInterface的定位,但是在模拟器和华为中,这个值都是ORIENTATION_UNDEFINED。也许在将Image(从ImageReader)转换为File时,忽略了Exif标记?
也许我需要在拍摄图像时手动设置ExifInterface,但是如果值是相同的,有什么区别呢?我们应该如何控制JPEG方向?
用该方法得到的定位结果(从谷歌camera2样本中得到的结果)对模拟器和华为来说是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;
}发布于 2020-02-29 21:17:58
模拟器是使用Camera2 API的一个非常糟糕的起点。本质上,它有遗留的Camera2支持,还有一些怪癖。
这就是说,在Android相机上,Jpeg定位是一个非常微妙的话题。官方文档解释说,旋转请求可能只适用于图像本身,或者只适用于EXIF标志,但有些设备(您测试了哪些华威?)一点也不服从。
还请注意BitmapFactory.decodeByteArray() ignores the EXIF flag,since the very beginning。
https://stackoverflow.com/questions/60466670
复制相似问题