Skip to content

Commit 8255747

Browse files
authored
refactor: Adds better error handling for image format YUV_420_888. (#730)
1 parent 74caf16 commit 8255747

File tree

1 file changed

+22
-10
lines changed

1 file changed

+22
-10
lines changed

packages/google_mlkit_commons/android/src/main/java/com/google_mlkit_commons/InputImageConverter.java

+22-10
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.google_mlkit_commons;
22

33
import android.content.Context;
4+
import android.graphics.ImageFormat;
45
import android.net.Uri;
56
import android.util.Log;
67

@@ -17,8 +18,8 @@ public class InputImageConverter {
1718

1819
//Returns an [InputImage] from the image data received
1920
public static InputImage getInputImageFromData(Map<String, Object> imageData,
20-
Context context,
21-
MethodChannel.Result result) {
21+
Context context,
22+
MethodChannel.Result result) {
2223
//Differentiates whether the image data is a path for a image file or contains image data in form of bytes
2324
String model = (String) imageData.get("type");
2425
InputImage inputImage;
@@ -29,7 +30,7 @@ public static InputImage getInputImageFromData(Map<String, Object> imageData,
2930
} catch (IOException e) {
3031
Log.e("ImageError", "Getting Image failed");
3132
Log.e("ImageError", e.toString());
32-
result.error("InputImageConverterError", e.toString(), null);
33+
result.error("InputImageConverterError", e.toString(), e);
3334
return null;
3435
}
3536
} else {
@@ -39,16 +40,27 @@ public static InputImage getInputImageFromData(Map<String, Object> imageData,
3940
Map<String, Object> metaData = (Map<String, Object>) imageData.get("metadata");
4041

4142
assert metaData != null;
42-
inputImage = InputImage.fromByteArray((byte[]) Objects.requireNonNull(imageData.get("bytes")),
43-
Double.valueOf(Objects.requireNonNull(metaData.get("width")).toString()).intValue(),
44-
Double.valueOf(Objects.requireNonNull(metaData.get("height")).toString()).intValue(),
45-
Integer.parseInt(Objects.requireNonNull(metaData.get("rotation")).toString()),
46-
Integer.parseInt(Objects.requireNonNull(metaData.get("image_format")).toString()));
47-
return inputImage;
43+
byte[] data = (byte[]) Objects.requireNonNull(imageData.get("bytes"));
44+
int imageFormat = Integer.parseInt(Objects.requireNonNull(metaData.get("image_format")).toString());
45+
int rotationDegrees = Integer.parseInt(Objects.requireNonNull(metaData.get("rotation")).toString());
46+
int width = Double.valueOf(Objects.requireNonNull(metaData.get("width")).toString()).intValue();
47+
int height = Double.valueOf(Objects.requireNonNull(metaData.get("height")).toString()).intValue();
48+
if (imageFormat == ImageFormat.NV21 || imageFormat == ImageFormat.YV12) {
49+
return InputImage.fromByteArray(
50+
data,
51+
width,
52+
height,
53+
rotationDegrees,
54+
imageFormat);
55+
}
56+
result.error("InputImageConverterError", "ImageFormat is not supported.", null);
57+
// TODO: Use InputImage.fromMediaImage, which supports more types, e.g. IMAGE_FORMAT_YUV_420_888.
58+
// See https://developers.google.com/android/reference/com/google/mlkit/vision/common/InputImage#fromMediaImage(android.media.Image,%20int)
59+
return null;
4860
} catch (Exception e) {
4961
Log.e("ImageError", "Getting Image failed");
5062
Log.e("ImageError", e.toString());
51-
result.error("InputImageConverterError", e.toString(), null);
63+
result.error("InputImageConverterError", e.toString(), e);
5264
return null;
5365
}
5466
} else {

0 commit comments

Comments
 (0)