【发布时间】:2020-02-29 15:27:43
【问题描述】:
我基于谷歌camera2示例创建了相机屏幕,所有代码几乎相同,相机拍照并以JPEG格式保存在设备上,但我有一些奇怪的行为。
例如,从模拟器拍照会将图像旋转 90 度(旋转的图像,不是预览),在我的华为上,图像没有旋转。
奇怪的是,屏幕旋转和传感器方向值在模拟器和华为上是相同的。 那么 jpeg 方向究竟是如何设置的呢?
同时探索CaptureRequest.JPEG_ORIENTATION
captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation))
我注意到这个方法对模拟器完全没有影响。
我尝试在保存位图后从ExifInterface 获取JPEG 方向,但在模拟器和华为中,该值都是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;
}
使用此方法从ImageReader获取Bitmap
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;
}
【问题讨论】:
标签: android camera android-camera android-camera2