From 7c5651c875b7a47598a8ce2a942bd3c7d15e95bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Caruso?= Date: Fri, 20 Mar 2020 16:25:51 +0100 Subject: [PATCH 1/2] Allow mlkit textrecognition to work in landscape mode on iOS --- src/mlkit/mlkit-cameraview.ios.ts | 17 +++++++++++++++++ src/mlkit/textrecognition/index.ios.ts | 4 ++++ 2 files changed, 21 insertions(+) diff --git a/src/mlkit/mlkit-cameraview.ios.ts b/src/mlkit/mlkit-cameraview.ios.ts index 00d8a2b1..6aecdb0e 100644 --- a/src/mlkit/mlkit-cameraview.ios.ts +++ b/src/mlkit/mlkit-cameraview.ios.ts @@ -97,6 +97,12 @@ export abstract class MLKitCameraView extends MLKitCameraViewBase { // this orientation is how the captured image is rotated (and shown) if (this.rotateRecording()) { this.cameraView.imageOrientation = UIImageOrientation.Right; + } else { + if (UIDevice.currentDevice.orientation === UIDeviceOrientation.LandscapeLeft) { + this.cameraView.imageOrientation = UIImageOrientation.Up; + } else { + this.cameraView.imageOrientation = UIImageOrientation.Down; + } } this.cameraView.delegate = TNSMLKitCameraViewDelegateImpl.createWithOwnerResultCallbackAndOptions( @@ -116,6 +122,17 @@ export abstract class MLKitCameraView extends MLKitCameraViewBase { this.previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.Portrait; } } + + // this orientation is how the captured image is rotated (and shown) + if (this.rotateRecording()) { + this.cameraView.imageOrientation = UIImageOrientation.Right; + } else { + if (UIDevice.currentDevice.orientation === UIDeviceOrientation.LandscapeLeft) { + this.cameraView.imageOrientation = UIImageOrientation.Up; + } else { + this.cameraView.imageOrientation = UIImageOrientation.Down; + } + } } public onLayout(left: number, top: number, right: number, bottom: number): void { diff --git a/src/mlkit/textrecognition/index.ios.ts b/src/mlkit/textrecognition/index.ios.ts index 8b9e0ae1..14a84f8e 100644 --- a/src/mlkit/textrecognition/index.ios.ts +++ b/src/mlkit/textrecognition/index.ios.ts @@ -1,3 +1,4 @@ +import { ios as iosUtils } from "tns-core-modules/utils/utils"; import { ImageSource } from "tns-core-modules/image-source"; import { MLKitVisionOptions } from "../"; import { MLKitRecognizeTextCloudOptions, MLKitRecognizeTextOnDeviceOptions, MLKitRecognizeTextResult } from "./"; @@ -25,6 +26,9 @@ export class MLKitTextRecognition extends MLKitTextRecognitionBase { } protected rotateRecording(): boolean { + if (iosUtils.isLandscape()) { + return false; + } return true; } } From fd66da0192a049bbd1a864804aea916fb453ed24 Mon Sep 17 00:00:00 2001 From: Adrian Rollett Date: Fri, 20 Mar 2020 12:36:55 -0600 Subject: [PATCH 2/2] Make text recognition work in all orientations --- src/mlkit/mlkit-cameraview.ios.ts | 78 ++++++++++++++++++++++++++----- 1 file changed, 66 insertions(+), 12 deletions(-) diff --git a/src/mlkit/mlkit-cameraview.ios.ts b/src/mlkit/mlkit-cameraview.ios.ts index 00d8a2b1..ff15b3f7 100644 --- a/src/mlkit/mlkit-cameraview.ios.ts +++ b/src/mlkit/mlkit-cameraview.ios.ts @@ -71,11 +71,22 @@ export abstract class MLKitCameraView extends MLKitCameraViewBase { this.previewLayer = AVCaptureVideoPreviewLayer.layerWithSession(this.captureSession); this.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; - if (iosUtils.isLandscape()) { - const deviceOrientation = UIDevice.currentDevice.orientation; - this.previewLayer.connection.videoOrientation = deviceOrientation === UIDeviceOrientation.LandscapeLeft ? AVCaptureVideoOrientation.LandscapeRight : AVCaptureVideoOrientation.LandscapeLeft; - } else { - this.previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.Portrait; + switch (UIDevice.currentDevice.orientation) { + case UIDeviceOrientation.LandscapeLeft: + this.previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.LandscapeRight; + break; + case UIDeviceOrientation.LandscapeRight: + this.previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.LandscapeLeft; + break; + case UIDeviceOrientation.Portrait: + this.previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.Portrait; + break; + case UIDeviceOrientation.PortraitUpsideDown: + this.previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.PortraitUpsideDown; + break; + default: + this.previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.Portrait; + break; } // note that when rotating back to portrait, this event fires very late.. not much we can do I think @@ -95,8 +106,22 @@ export abstract class MLKitCameraView extends MLKitCameraViewBase { this.cameraView.processEveryXFrames = this.processEveryNthFrame; // this orientation is how the captured image is rotated (and shown) - if (this.rotateRecording()) { - this.cameraView.imageOrientation = UIImageOrientation.Right; + switch (UIDevice.currentDevice.orientation) { + case UIDeviceOrientation.Portrait: + this.cameraView.imageOrientation = UIImageOrientation.Right; + break; + case UIDeviceOrientation.PortraitUpsideDown: + this.cameraView.imageOrientation = UIImageOrientation.Left; + break; + case UIDeviceOrientation.LandscapeLeft: + this.cameraView.imageOrientation = UIImageOrientation.Up; + break; + case UIDeviceOrientation.LandscapeRight: + this.cameraView.imageOrientation = UIImageOrientation.Down; + break; + default: + this.cameraView.imageOrientation = UIImageOrientation.Right; + break; } this.cameraView.delegate = TNSMLKitCameraViewDelegateImpl.createWithOwnerResultCallbackAndOptions( @@ -109,13 +134,42 @@ export abstract class MLKitCameraView extends MLKitCameraViewBase { private rotateOnOrientationChange(args: OrientationChangedEventData): void { if (this.previewLayer) { - if (args.newValue === "landscape") { - const deviceOrientation = UIDevice.currentDevice.orientation; - this.previewLayer.connection.videoOrientation = deviceOrientation === UIDeviceOrientation.LandscapeLeft ? AVCaptureVideoOrientation.LandscapeRight : AVCaptureVideoOrientation.LandscapeLeft; - } else if (args.newValue === "portrait") { - this.previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.Portrait; + switch (UIDevice.currentDevice.orientation) { + case UIDeviceOrientation.LandscapeLeft: + this.previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.LandscapeRight; + break; + case UIDeviceOrientation.LandscapeRight: + this.previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.LandscapeLeft; + break; + case UIDeviceOrientation.Portrait: + this.previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.Portrait; + break; + case UIDeviceOrientation.PortraitUpsideDown: + this.previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.PortraitUpsideDown; + break; + default: + this.previewLayer.connection.videoOrientation = AVCaptureVideoOrientation.Portrait; + break; } } + + switch (UIDevice.currentDevice.orientation) { + case UIDeviceOrientation.Portrait: + this.cameraView.imageOrientation = UIImageOrientation.Right; + break; + case UIDeviceOrientation.PortraitUpsideDown: + this.cameraView.imageOrientation = UIImageOrientation.Left; + break; + case UIDeviceOrientation.LandscapeLeft: + this.cameraView.imageOrientation = UIImageOrientation.Up; + break; + case UIDeviceOrientation.LandscapeRight: + this.cameraView.imageOrientation = UIImageOrientation.Down; + break; + default: + this.cameraView.imageOrientation = UIImageOrientation.Right; + break; + } } public onLayout(left: number, top: number, right: number, bottom: number): void {