UIImagePickerController 前置摄像头在预览视图中显示镜像
UIImagePickerController front camera show mirror image on preview view
我知道很多人问过这个问题,但我没有找到解决这个问题的正确答案,我的问题是:如何在预览视图中制作照片(用户点击捕获按钮,然后转到预览视图让用户预览)不是镜像,这个可能在 UIImagePickerController 中修复,我知道如何旋转照片,UIImageOrientation
中的枚举中的东西 [= =12=],我知道这是什么意思。
尝试 1:
我在用户点击 capture 按钮后获取照片,然后进入预览视图并使用我有镜像的照片覆盖默认照片(使用 cameraOverlayView
), 我可以检测到用户点击 capture 按钮使用 NSNotificationCenter
和 @"_UIImagePickerControllerUserDidCaptureItem", 但我找不到办法获取照片。
尝试 2:
我使用cameraViewTransform
,但是当用户拍照(前置摄像头)时,当主页按钮在底部或顶部时,预览视图中的图像不是镜像, 但是当 Home
按钮在左侧或右侧时, phone 上的图像在用户点击 捕获 之前有一些问题, 尽管预览视图上的图像不是 mirror.use AVCaptureDeviceDidStartRunningNotification
通知。
- (void)cameraChanged:(NSNotification *)notification
{
if(self.imagePickerController.cameraDevice == UIImagePickerControllerCameraDeviceFront)
{
self.imagePickerController.cameraViewTransform = CGAffineTransformIdentity;
self.imagePickerController.cameraViewTransform = CGAffineTransformScale(self.imagePickerController.cameraViewTransform, -1, 1);
if (self.imagePickerController.cameraOverlayView) {
NSLog_DEBUG(@"self.imagePickerController.cameraOverlayView is not nil");
} else {
NSLog_DEBUG(@"self.imagePickerController.cameraOverlayView is nil");
}
self.imagePickerController.cameraOverlayView.transform = CGAffineTransformScale(self.imagePickerController.cameraViewTransform, -1, 1);
} else {
self.imagePickerController.cameraViewTransform = CGAffineTransformIdentity;
}
}
最后,我无法在UIImagePickerController
中解决这个问题,但是我使用AVFoundation
和CoreMotion
解决了这个问题,你可以看到AVCam
//init the motionManager
- (void)initializeMotionManager{
motionManager = [[CMMotionManager alloc] init];
motionManager.accelerometerUpdateInterval = .1;
motionManager.gyroUpdateInterval = .1;
[motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue]
withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
if (!error) {
[self outputAccelertionData:accelerometerData.acceleration];
}
else{
NSLog_DEBUG(@"%@", error);
}
}];
}
//detect the device orientation
- (void)outputAccelertionData:(CMAcceleration)acceleration{
if (acceleration.x >= 0.75) {
_orientationNew = UIInterfaceOrientationLandscapeLeft;
}
else if (acceleration.x <= -0.75) {
_orientationNew = UIInterfaceOrientationLandscapeRight;
}
else if (acceleration.y <= -0.75) {
_orientationNew = UIInterfaceOrientationPortrait;
}
else if (acceleration.y >= 0.75) {
_orientationNew = UIInterfaceOrientationPortraitUpsideDown;
}
else {
// Consider same as last time
return;
}
if (_orientationNew == _orientationLast)
return;
_orientationLast = _orientationNew;
}
我知道很多人问过这个问题,但我没有找到解决这个问题的正确答案,我的问题是:如何在预览视图中制作照片(用户点击捕获按钮,然后转到预览视图让用户预览)不是镜像,这个可能在 UIImagePickerController 中修复,我知道如何旋转照片,UIImageOrientation
中的枚举中的东西 [= =12=],我知道这是什么意思。
尝试 1:
我在用户点击 capture 按钮后获取照片,然后进入预览视图并使用我有镜像的照片覆盖默认照片(使用 cameraOverlayView
), 我可以检测到用户点击 capture 按钮使用 NSNotificationCenter
和 @"_UIImagePickerControllerUserDidCaptureItem", 但我找不到办法获取照片。
尝试 2:
我使用cameraViewTransform
,但是当用户拍照(前置摄像头)时,当主页按钮在底部或顶部时,预览视图中的图像不是镜像, 但是当 Home
按钮在左侧或右侧时, phone 上的图像在用户点击 捕获 之前有一些问题, 尽管预览视图上的图像不是 mirror.use AVCaptureDeviceDidStartRunningNotification
通知。
- (void)cameraChanged:(NSNotification *)notification
{
if(self.imagePickerController.cameraDevice == UIImagePickerControllerCameraDeviceFront)
{
self.imagePickerController.cameraViewTransform = CGAffineTransformIdentity;
self.imagePickerController.cameraViewTransform = CGAffineTransformScale(self.imagePickerController.cameraViewTransform, -1, 1);
if (self.imagePickerController.cameraOverlayView) {
NSLog_DEBUG(@"self.imagePickerController.cameraOverlayView is not nil");
} else {
NSLog_DEBUG(@"self.imagePickerController.cameraOverlayView is nil");
}
self.imagePickerController.cameraOverlayView.transform = CGAffineTransformScale(self.imagePickerController.cameraViewTransform, -1, 1);
} else {
self.imagePickerController.cameraViewTransform = CGAffineTransformIdentity;
}
}
最后,我无法在UIImagePickerController
中解决这个问题,但是我使用AVFoundation
和CoreMotion
解决了这个问题,你可以看到AVCam
//init the motionManager
- (void)initializeMotionManager{
motionManager = [[CMMotionManager alloc] init];
motionManager.accelerometerUpdateInterval = .1;
motionManager.gyroUpdateInterval = .1;
[motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue]
withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
if (!error) {
[self outputAccelertionData:accelerometerData.acceleration];
}
else{
NSLog_DEBUG(@"%@", error);
}
}];
}
//detect the device orientation
- (void)outputAccelertionData:(CMAcceleration)acceleration{
if (acceleration.x >= 0.75) {
_orientationNew = UIInterfaceOrientationLandscapeLeft;
}
else if (acceleration.x <= -0.75) {
_orientationNew = UIInterfaceOrientationLandscapeRight;
}
else if (acceleration.y <= -0.75) {
_orientationNew = UIInterfaceOrientationPortrait;
}
else if (acceleration.y >= 0.75) {
_orientationNew = UIInterfaceOrientationPortraitUpsideDown;
}
else {
// Consider same as last time
return;
}
if (_orientationNew == _orientationLast)
return;
_orientationLast = _orientationNew;
}