Skip to content
This repository was archived by the owner on Apr 4, 2023. It is now read-only.

Commit f512a84

Browse files
Bounds property of barcode scan result not the same for iOS and Android #1288
1 parent 5a23227 commit f512a84

File tree

3 files changed

+40
-19
lines changed

3 files changed

+40
-19
lines changed

src/mlkit/barcodescanning/index.android.ts

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { ImageSource } from "tns-core-modules/image-source";
22
import { MLKitScanBarcodesOnDeviceOptions, MLKitScanBarcodesOnDeviceResult, MLKitScanBarcodesResultBounds } from "./";
3-
import { MLKitVisionOptions } from "../index";
43
import { BarcodeFormat, MLKitBarcodeScanner as MLKitBarcodeScannerBase } from "./barcodescanning-common";
54
import * as application from "tns-core-modules/application";
65

@@ -68,14 +67,21 @@ export class MLKitBarcodeScanner extends MLKitBarcodeScannerBase {
6867
};
6968

7069
if (barcodes && barcodes.size() > 0) {
70+
71+
const image: android.graphics.Bitmap = this.lastVisionImage ? this.lastVisionImage.getBitmap() : null;
72+
7173
// see https://github.com/firebase/quickstart-android/blob/0f4c86877fc5f771cac95797dffa8bd026dd9dc7/mlkit/app/src/main/java/com/google/firebase/samples/apps/mlkit/textrecognition/TextRecognitionProcessor.java#L62
7274
for (let i = 0; i < barcodes.size(); i++) {
7375
const barcode = barcodes.get(i);
7476
result.barcodes.push({
7577
value: barcode.getRawValue(),
7678
format: BarcodeFormat[barcode.getFormat()],
7779
android: barcode,
78-
bounds: boundingBoxToBounds(barcode.getBoundingBox())
80+
bounds: boundingBoxToBounds(barcode.getBoundingBox()),
81+
image: !image ? null : {
82+
width: image.getWidth(),
83+
height: image.getHeight()
84+
}
7985
});
8086
}
8187

@@ -124,6 +130,9 @@ export function scanBarcodesOnDevice(options: MLKitScanBarcodesOnDeviceOptions):
124130
try {
125131
const firebaseVisionBarcodeDetector = getBarcodeDetector(options.formats);
126132

133+
const image: android.graphics.Bitmap = options.image instanceof ImageSource ? options.image.android : options.image.imageSource.android;
134+
const firImage = com.google.firebase.ml.vision.common.FirebaseVisionImage.fromBitmap(image);
135+
127136
const onSuccessListener = new gmsTasks.OnSuccessListener({
128137
onSuccess: barcodes => {
129138
const result = <MLKitScanBarcodesOnDeviceResult>{
@@ -138,7 +147,11 @@ export function scanBarcodesOnDevice(options: MLKitScanBarcodesOnDeviceOptions):
138147
value: barcode.getRawValue(),
139148
format: BarcodeFormat[barcode.getFormat()],
140149
android: barcode,
141-
bounds: boundingBoxToBounds(barcode.getBoundingBox())
150+
bounds: boundingBoxToBounds(barcode.getBoundingBox()),
151+
image: {
152+
width: image.getWidth(),
153+
height: image.getHeight()
154+
}
142155
});
143156
}
144157
}
@@ -153,7 +166,7 @@ export function scanBarcodesOnDevice(options: MLKitScanBarcodesOnDeviceOptions):
153166
});
154167

155168
firebaseVisionBarcodeDetector
156-
.detectInImage(getImage(options))
169+
.detectInImage(firImage)
157170
.addOnSuccessListener(onSuccessListener)
158171
.addOnFailureListener(onFailureListener);
159172

@@ -163,8 +176,3 @@ export function scanBarcodesOnDevice(options: MLKitScanBarcodesOnDeviceOptions):
163176
}
164177
});
165178
}
166-
167-
function getImage(options: MLKitVisionOptions): any /* com.google.firebase.ml.vision.common.FirebaseVisionImage */ {
168-
const image: android.graphics.Bitmap = options.image instanceof ImageSource ? options.image.android : options.image.imageSource.android;
169-
return com.google.firebase.ml.vision.common.FirebaseVisionImage.fromBitmap(image);
170-
}

src/mlkit/barcodescanning/index.d.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ export interface MLKitScanBarcodesResultBounds {
1717
export interface MLKitScanBarcodesResultBarcode {
1818
value: string;
1919
format: string;
20-
bounds?: MLKitScanBarcodesResultBounds;
20+
bounds: MLKitScanBarcodesResultBounds;
21+
image: {
22+
width: number;
23+
height: number;
24+
}
2125
ios?: any;
2226
android?: any;
2327
}

src/mlkit/barcodescanning/index.ios.ts

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ export class MLKitBarcodeScanner extends MLKitBarcodeScannerBase {
4646
for (let i = 0, l = barcodes.count; i < l; i++) {
4747
const barcode: FIRVisionBarcode = barcodes.objectAtIndex(i);
4848
const image: UIImage = this.lastVisionImage;
49+
let imageWidth = image.size.width;
50+
let imageHeight = image.size.height;
4951

5052
// the iOS image is rotated, so compensate for it when reporting these
5153
let { x, y } = barcode.frame.origin;
@@ -54,6 +56,7 @@ export class MLKitBarcodeScanner extends MLKitBarcodeScannerBase {
5456
if (image) {
5557
const origX = x;
5658
const origWidth = width;
59+
const origImageWidth = imageWidth;
5760

5861
if (iosUtils.isLandscape()) {
5962
if (UIDevice.currentDevice.orientation === UIDeviceOrientation.LandscapeRight) {
@@ -67,9 +70,9 @@ export class MLKitBarcodeScanner extends MLKitBarcodeScannerBase {
6770
y = origX;
6871
width = height;
6972
height = origWidth;
73+
imageWidth = imageHeight;
74+
imageHeight = origImageWidth;
7075
}
71-
72-
console.log("iosUtils.isLandscape(): " + iosUtils.isLandscape() + ", deviceOrientation: " + UIDevice.currentDevice.orientation);
7376
}
7477

7578
result.barcodes.push({
@@ -85,6 +88,10 @@ export class MLKitBarcodeScanner extends MLKitBarcodeScannerBase {
8588
width,
8689
height
8790
}
91+
},
92+
image: {
93+
width: imageWidth,
94+
height: imageHeight
8895
}
8996
});
9097
}
@@ -122,7 +129,10 @@ export function scanBarcodesOnDevice(options: MLKitScanBarcodesOnDeviceOptions):
122129
try {
123130
const barcodeDetector = getBarcodeDetector(options.formats);
124131

125-
barcodeDetector.detectInImageCompletion(getImage(options), (barcodes: NSArray<FIRVisionBarcode>, error: NSError) => {
132+
const image: UIImage = options.image instanceof ImageSource ? options.image.ios : options.image.imageSource.ios;
133+
const firImage = FIRVisionImage.alloc().initWithImage(image);
134+
135+
barcodeDetector.detectInImageCompletion(firImage, (barcodes: NSArray<FIRVisionBarcode>, error: NSError) => {
126136
if (error !== null) {
127137
reject(error.localizedDescription);
128138

@@ -137,7 +147,11 @@ export function scanBarcodesOnDevice(options: MLKitScanBarcodesOnDeviceOptions):
137147
value: barcode.rawValue,
138148
format: BarcodeFormat[barcode.format],
139149
ios: barcode,
140-
bounds: barcode.frame
150+
bounds: barcode.frame,
151+
image: {
152+
width: image.size.width,
153+
height: image.size.height
154+
}
141155
});
142156
}
143157
resolve(result);
@@ -149,8 +163,3 @@ export function scanBarcodesOnDevice(options: MLKitScanBarcodesOnDeviceOptions):
149163
}
150164
});
151165
}
152-
153-
function getImage(options: MLKitVisionOptions): FIRVisionImage {
154-
const image: UIImage = options.image instanceof ImageSource ? options.image.ios : options.image.imageSource.ios;
155-
return FIRVisionImage.alloc().initWithImage(image);
156-
}

0 commit comments

Comments
 (0)