如何解决Camera2预览和捕获的图像看起来有所不同
默认情况下,我捕获到的图像旋转了-90度,我需要将其旋转回去,但是其高度与屏幕的高度不同,所以我的图像不会充满屏幕。
拍照后在横向模式下,它仅显示捕获的图像的右上角。
我尝试了所有可用的示例,但是找不到解决方案。
private void SetUpCameraOutputs(int width,int height)
{
_manager = (CameraManager)_context.GetSystemService(Context.CameraService);
string[] cameraIds = _manager.GetCameraIdList();
_cameraId = cameraIds[0];
CameraCharacteristics chararc = _manager.GetCameraCharacteristics(cameraIds[i])
var characteristics = _manager.GetCameraCharacteristics(_cameraId);
var map = (StreamConfigurationMap)characteristics.Get(CameraCharacteristics.ScalerStreamConfigurationMap);
if (_supportedJpegSizes == null && characteristics != null){
_supportedJpegSizes = ((StreamConfigurationMap)characteristics.Get(CameraCharacteristics.ScalerStreamConfigurationMap)).GetOutputSizes((int)ImageFormatType.Jpeg);
}
if (_supportedJpegSizes != null && _supportedJpegSizes.Length > 0){
_idealPhotoSize = GetOptimalSize(_supportedJpegSizes,1050,1400);
}
_imageReader = ImageReader.NewInstance(_idealPhotoSize.Width,_idealPhotoSize.Height,ImageFormatType.Jpeg,1);
var readerListener = new ImageAvailableListener();
readerListener.Photo += (sender,buffer) =>
{
Photo?.Invoke(this,buffer);
};
_flashSupported = HasFLash(characteristics);
_imageReader.SetOnImageAvailableListener(readerListener,_backgroundHandler);
_previewSize = GetOptimalSize(map.GetOutputSizes(Class.FromType(typeof(SurfaceTexture))),_idealPhotoSize.Width);
}
TakePhoto方法:
public void TakePhoto()
{
if (_context == null || CameraDevice == null) return;
if (_captureBuilder == null)
_captureBuilder = CameraDevice.CreateCaptureRequest(CameraTemplate.StillCapture);
_captureBuilder.AddTarget(_imageReader.Surface);
_captureBuilder.Set(CaptureRequest.ControlAfMode,(int)ControlAFMode.ContinuousPicture);
var windowManager = _context.GetSystemService(Context.WindowService).JavaCast<IWindowManager>();
var rotation = windowManager.DefaultDisplay.Rotation;
_captureBuilder.Set(CaptureRequest.JpegOrientation,new Integer(Orientations.Get((int)rotation)));
_previewSession.StopRepeating();
_previewSession.Capture(_captureBuilder.Build(),new CameraCaptureStillPictureSessionCallback
{
OnCaptureCompletedAction = session =>
{
UnlockFocus();
}
},null);
}
还有我的OnPhoto方法:
private void OnPhoto(object sender,byte[] imgSource)
{
Android.Graphics.Bitmap bitmap = BitmapFactory.DecodeByteArray(imgSource,imgSource.Length);
var windowManager = _context.GetSystemService(Context.WindowService).JavaCast<IWindowManager>();
var rotation = windowManager.DefaultDisplay.Rotation;
if (rotation == SurfaceOrientation.Rotation0 || rotation == SurfaceOrientation.Rotation180)
{
bitmap = resizeAndRotate(bitmap,bitmap.Width,bitmap.Height); //rotate bitmap by 90
}
var SkBitmap = bitmap.ToSKBitmap();
Application.Current.Properties["bitmap"] = SkBitmap;
Device.BeginInvokeOnMainThread(() =>
{
_currentElement?.PictureTaken();
});
}
解决方法
为纵向模式创建位图时,必须更改位图的宽度和高度。 这样宽度就变成了纵向图像,而高度变成了纵向图像的宽度。
int newWidth = oldHeight;
int newHeight = oldWidth;
Bitmap newBitmap =Bitmap.createScaledBitmap(oldbitmap,newWidth,newHeight,true);
您现在已经完成了newBitmap的真实显示而无需拉伸。
根据您的代码,只需使用以下命令即可还原位图的宽度和高度:
bitmap = resizeAndRotate(bitmap,bitmap.height,bitmap.width);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。