Showing
3 changed files
with
212 additions
and
57 deletions
@@ -5,25 +5,55 @@ uint32_t *convertImage(uint8_t *plane0, uint8_t *plane1, uint8_t *plane2, int by | @@ -5,25 +5,55 @@ uint32_t *convertImage(uint8_t *plane0, uint8_t *plane1, uint8_t *plane2, int by | ||
5 | import 'dart:ffi'; | 5 | import 'dart:ffi'; |
6 | 6 | ||
7 | /* | 7 | /* |
8 | - native convert camera image to rgb | 8 | + native convert camera image YUV420p to rgb |
9 | */ | 9 | */ |
10 | -typedef ConvertImageRGBC = Pointer<Uint32> Function(Pointer<Uint8>, | ||
11 | - Pointer<Uint8>, Pointer<Uint8>, Int32, Int32, Int32, Int32, Double); | ||
12 | -typedef ConvertImageRGBFlutter = Pointer<Uint32> Function( | ||
13 | - Pointer<Uint8>, Pointer<Uint8>, Pointer<Uint8>, int, int, int, int, double); | 10 | +typedef ConvertImageYuv420pToRGBC = Pointer<Uint32> Function( |
11 | + Pointer<Uint8>, | ||
12 | + Pointer<Uint8>, | ||
13 | + Pointer<Uint8>, | ||
14 | + Int32, | ||
15 | + Int32, | ||
16 | + Int32, | ||
17 | + Int32, | ||
18 | + Double, | ||
19 | + Uint32, | ||
20 | + Bool, | ||
21 | + Bool, | ||
22 | +); | ||
23 | +typedef ConvertImageYuv420pToRGBFlutter = Pointer<Uint32> Function( | ||
24 | + Pointer<Uint8>, | ||
25 | + Pointer<Uint8>, | ||
26 | + Pointer<Uint8>, | ||
27 | + int, | ||
28 | + int, | ||
29 | + int, | ||
30 | + int, | ||
31 | + double, | ||
32 | + int, | ||
33 | + bool, | ||
34 | + bool, | ||
35 | +); | ||
14 | 36 | ||
15 | /* | 37 | /* |
16 | - native convert camera image to grayscale 32 bit | 38 | + native convert camera image YUV420p to grayscale 32 bit |
17 | */ | 39 | */ |
18 | -typedef ConvertImageGrayC = Pointer<Uint32> Function( | ||
19 | - Pointer<Uint8>, Int32, Int32, Double); | ||
20 | -typedef ConvertImageGrayFlutter = Pointer<Uint32> Function( | ||
21 | - Pointer<Uint8>, int, int, double); | 40 | +typedef ConvertImageYuv420pToGrayC = Pointer<Uint32> Function( |
41 | + Pointer<Uint8>, Int32, Int32, Double, Uint32, Bool, Bool); | ||
42 | +typedef ConvertImageYuv420pToGrayFlutter = Pointer<Uint32> Function( | ||
43 | + Pointer<Uint8>, int, int, double, int, bool, bool); | ||
22 | 44 | ||
23 | /* | 45 | /* |
24 | - native convert camera image to grayscale 8 bit | 46 | + native convert camera image YUV420p to grayscale 8 bit |
25 | */ | 47 | */ |
26 | -typedef ConvertImageGray8BitC = Pointer<Uint8> Function( | ||
27 | - Pointer<Uint8>, Int32, Int32, Double); | ||
28 | -typedef ConvertImageGray8BitFlutter = Pointer<Uint8> Function( | ||
29 | - Pointer<Uint8>, int, int, double); | 48 | +typedef ConvertImageYuv420pToGray8BitC = Pointer<Uint8> Function( |
49 | + Pointer<Uint8>, Int32, Int32, Double, Uint8, Bool, Bool); | ||
50 | +typedef ConvertImageYuv420pToGray8BitFlutter = Pointer<Uint8> Function( | ||
51 | + Pointer<Uint8>, int, int, double, int, bool, bool); | ||
52 | + | ||
53 | +/* | ||
54 | + native convert camera image YUV420sp( or NV12) to rgb | ||
55 | +*/ | ||
56 | +typedef ConvertImageNV12ToRGBC = Pointer<Uint32> Function(Pointer<Uint8>, | ||
57 | + Pointer<Uint8>, Int32, Int32, Int32, Int32, Double, Uint32, Bool, Bool); | ||
58 | +typedef ConvertImageNV12ToRGBFlutter = Pointer<Uint32> Function(Pointer<Uint8>, | ||
59 | + Pointer<Uint8>, int, int, int, int, double, int, bool, bool); |
@@ -17,6 +17,9 @@ abstract class ProcessingCameraImage { | @@ -17,6 +17,9 @@ abstract class ProcessingCameraImage { | ||
17 | int? bytesPerRowPlane0, | 17 | int? bytesPerRowPlane0, |
18 | int? bytesPerRowPlane1, | 18 | int? bytesPerRowPlane1, |
19 | int? bytesPerPixelPlan1, | 19 | int? bytesPerPixelPlan1, |
20 | + int backGroundColor = 0xFFFFFFFF, | ||
21 | + bool isFlipHoriozntal = false, | ||
22 | + bool isFlipVectical = false, | ||
20 | }); | 23 | }); |
21 | 24 | ||
22 | /// [processCameraImageToGray]. for Android with YUV420. | 25 | /// [processCameraImageToGray]. for Android with YUV420. |
@@ -25,22 +28,35 @@ abstract class ProcessingCameraImage { | @@ -25,22 +28,35 @@ abstract class ProcessingCameraImage { | ||
25 | int? height, | 28 | int? height, |
26 | Uint8List? plane0, | 29 | Uint8List? plane0, |
27 | double? rotationAngle, | 30 | double? rotationAngle, |
31 | + int backGroundColor = 0xFFFFFFFF, | ||
32 | + bool isFlipHoriozntal = false, | ||
33 | + bool isFlipVectical = false, | ||
28 | }); | 34 | }); |
29 | 35 | ||
30 | - /// [processCameraImageToRGBIOS]. for IOS with YUV420. | 36 | + /// [processCameraImageToRGBIOS]. for IOS with NV12. |
31 | imglib.Image? processCameraImageToRGBIOS({ | 37 | imglib.Image? processCameraImageToRGBIOS({ |
32 | int? width, | 38 | int? width, |
33 | int? height, | 39 | int? height, |
34 | Uint8List? plane0, | 40 | Uint8List? plane0, |
41 | + Uint8List? plane1, | ||
35 | double? rotationAngle, | 42 | double? rotationAngle, |
43 | + int? bytesPerRowPlane0, | ||
44 | + int? bytesPerRowPlane1, | ||
45 | + int? bytesPerPixelPlan1, | ||
46 | + int backGroundColor = 0xFFFFFFFF, | ||
47 | + bool isFlipHoriozntal = false, | ||
48 | + bool isFlipVectical = false, | ||
36 | }); | 49 | }); |
37 | 50 | ||
38 | - /// [processCameraImageToGrayIOS]. for IOS with YUV420. | 51 | + /// [processCameraImageToGrayIOS]. for IOS with NV12. |
39 | imglib.Image? processCameraImageToGrayIOS({ | 52 | imglib.Image? processCameraImageToGrayIOS({ |
40 | int? width, | 53 | int? width, |
41 | int? height, | 54 | int? height, |
42 | Uint8List? plane0, | 55 | Uint8List? plane0, |
43 | double? rotationAngle, | 56 | double? rotationAngle, |
57 | + int backGroundColor = 0xFFFFFFFF, | ||
58 | + bool isFlipHoriozntal = false, | ||
59 | + bool isFlipVectical = false, | ||
44 | }); | 60 | }); |
45 | 61 | ||
46 | /// [processCameraImageToGray8Bit]. for Android with YUV420. | 62 | /// [processCameraImageToGray8Bit]. for Android with YUV420. |
@@ -49,5 +65,8 @@ abstract class ProcessingCameraImage { | @@ -49,5 +65,8 @@ abstract class ProcessingCameraImage { | ||
49 | int? height, | 65 | int? height, |
50 | Uint8List? plane0, | 66 | Uint8List? plane0, |
51 | double? rotationAngle, | 67 | double? rotationAngle, |
68 | + int backGroundColor = 0xFF, | ||
69 | + bool isFlipHoriozntal = false, | ||
70 | + bool isFlipVectical = false, | ||
52 | }); | 71 | }); |
53 | } | 72 | } |
@@ -11,9 +11,11 @@ import 'processing_camera_image.dart'; | @@ -11,9 +11,11 @@ import 'processing_camera_image.dart'; | ||
11 | 11 | ||
12 | class IProcessingCameraImage implements ProcessingCameraImage { | 12 | class IProcessingCameraImage implements ProcessingCameraImage { |
13 | static IProcessingCameraImage? _instance; | 13 | static IProcessingCameraImage? _instance; |
14 | - late final ConvertImageRGBFlutter _convertImageRGB; | ||
15 | - late final ConvertImageGrayFlutter _convertImageGrayFlutter; | ||
16 | - late final ConvertImageGray8BitFlutter _convertImageGray8BitFlutter; | 14 | + late final ConvertImageYuv420pToRGBFlutter _convertImageYuv420pToRGB; |
15 | + late final ConvertImageYuv420pToGrayFlutter _convertImageYuv420pToGray; | ||
16 | + late final ConvertImageYuv420pToGray8BitFlutter | ||
17 | + _convertImageYuv420pToGray8Bit; | ||
18 | + late final ConvertImageNV12ToRGBFlutter _convertImageNV12ToRGB; | ||
17 | 19 | ||
18 | factory IProcessingCameraImage() { | 20 | factory IProcessingCameraImage() { |
19 | _instance ??= IProcessingCameraImage._(); | 21 | _instance ??= IProcessingCameraImage._(); |
@@ -24,18 +26,24 @@ class IProcessingCameraImage implements ProcessingCameraImage { | @@ -24,18 +26,24 @@ class IProcessingCameraImage implements ProcessingCameraImage { | ||
24 | final DynamicLibrary convertImageLib = Platform.isAndroid | 26 | final DynamicLibrary convertImageLib = Platform.isAndroid |
25 | ? DynamicLibrary.open("libconvertImage.so") | 27 | ? DynamicLibrary.open("libconvertImage.so") |
26 | : DynamicLibrary.process(); | 28 | : DynamicLibrary.process(); |
27 | - _convertImageRGB = convertImageLib | ||
28 | - .lookup<NativeFunction<ConvertImageRGBC>>('convert_image_rgb') | ||
29 | - .asFunction<ConvertImageRGBFlutter>(); | ||
30 | - | ||
31 | - _convertImageGrayFlutter = convertImageLib | ||
32 | - .lookup<NativeFunction<ConvertImageGrayC>>('convert_image_gray_scale') | ||
33 | - .asFunction<ConvertImageGrayFlutter>(); | ||
34 | - | ||
35 | - _convertImageGray8BitFlutter = convertImageLib | ||
36 | - .lookup<NativeFunction<ConvertImageGray8BitC>>( | ||
37 | - 'convert_image_gray_scale_8bit') | ||
38 | - .asFunction<ConvertImageGray8BitFlutter>(); | 29 | + _convertImageYuv420pToRGB = convertImageLib |
30 | + .lookup<NativeFunction<ConvertImageYuv420pToRGBC>>( | ||
31 | + 'convert_image_yuv420p_to_rgb') | ||
32 | + .asFunction<ConvertImageYuv420pToRGBFlutter>(); | ||
33 | + | ||
34 | + _convertImageYuv420pToGray = convertImageLib | ||
35 | + .lookup<NativeFunction<ConvertImageYuv420pToGrayC>>( | ||
36 | + 'convert_image_yuv420p_to_gray') | ||
37 | + .asFunction<ConvertImageYuv420pToGrayFlutter>(); | ||
38 | + | ||
39 | + _convertImageYuv420pToGray8Bit = convertImageLib | ||
40 | + .lookup<NativeFunction<ConvertImageYuv420pToGray8BitC>>( | ||
41 | + 'convert_image_yuv420p_to_gray_8bit') | ||
42 | + .asFunction<ConvertImageYuv420pToGray8BitFlutter>(); | ||
43 | + _convertImageNV12ToRGB = convertImageLib | ||
44 | + .lookup<NativeFunction<ConvertImageNV12ToRGBC>>( | ||
45 | + 'convert_image_nv12_to_rgb') | ||
46 | + .asFunction<ConvertImageNV12ToRGBFlutter>(); | ||
39 | } | 47 | } |
40 | 48 | ||
41 | /// [ProcessCameraImageToRGB]. | 49 | /// [ProcessCameraImageToRGB]. |
@@ -50,12 +58,18 @@ class IProcessingCameraImage implements ProcessingCameraImage { | @@ -50,12 +58,18 @@ class IProcessingCameraImage implements ProcessingCameraImage { | ||
50 | int? bytesPerRowPlane0, | 58 | int? bytesPerRowPlane0, |
51 | int? bytesPerRowPlane1, | 59 | int? bytesPerRowPlane1, |
52 | int? bytesPerPixelPlan1, | 60 | int? bytesPerPixelPlan1, |
61 | + int backGroundColor = 0xFFFFFFFF, | ||
62 | + bool isFlipHoriozntal = false, | ||
63 | + bool isFlipVectical = false, | ||
53 | }) { | 64 | }) { |
54 | if (width == null || | 65 | if (width == null || |
55 | height == null || | 66 | height == null || |
56 | - plane0?.isEmpty == null || | ||
57 | - plane1?.isEmpty == null || | ||
58 | - plane2?.isEmpty == null || | 67 | + plane0 == null || |
68 | + plane1 == null || | ||
69 | + plane2 == null || | ||
70 | + plane0.isEmpty || | ||
71 | + plane1.isEmpty || | ||
72 | + plane2.isEmpty || | ||
59 | bytesPerRowPlane0 == null || | 73 | bytesPerRowPlane0 == null || |
60 | bytesPerRowPlane1 == null || | 74 | bytesPerRowPlane1 == null || |
61 | bytesPerPixelPlan1 == null) { | 75 | bytesPerPixelPlan1 == null) { |
@@ -70,21 +84,32 @@ class IProcessingCameraImage implements ProcessingCameraImage { | @@ -70,21 +84,32 @@ class IProcessingCameraImage implements ProcessingCameraImage { | ||
70 | int newImgHeight = (sinVal * bytesPerRowPlane0 + cosVal * height).toInt(); | 84 | int newImgHeight = (sinVal * bytesPerRowPlane0 + cosVal * height).toInt(); |
71 | 85 | ||
72 | // Allocate memory for the 3 planes of the image | 86 | // Allocate memory for the 3 planes of the image |
73 | - Pointer<Uint8> p = ffi.malloc.allocate(plane0?.length ?? 0); | ||
74 | - Pointer<Uint8> p1 = ffi.malloc.allocate(plane1?.length ?? 0); | ||
75 | - Pointer<Uint8> p2 = ffi.malloc.allocate(plane2?.length ?? 0); | 87 | + Pointer<Uint8> p = ffi.malloc.allocate(plane0.length); |
88 | + Pointer<Uint8> p1 = ffi.malloc.allocate(plane1.length); | ||
89 | + Pointer<Uint8> p2 = ffi.malloc.allocate(plane2.length); | ||
76 | 90 | ||
77 | // Assign the planes data to the pointers of the image | 91 | // Assign the planes data to the pointers of the image |
78 | - Uint8List pointerList = p.asTypedList(plane0?.length ?? 0); | ||
79 | - Uint8List pointerList1 = p1.asTypedList(plane1?.length ?? 0); | ||
80 | - Uint8List pointerList2 = p2.asTypedList(plane2?.length ?? 0); | ||
81 | - pointerList.setRange(0, plane0?.length ?? 0, plane0 ?? Uint8List(0)); | ||
82 | - pointerList1.setRange(0, plane1?.length ?? 0, plane1 ?? Uint8List(0)); | ||
83 | - pointerList2.setRange(0, plane2?.length ?? 0, plane2 ?? Uint8List(0)); | 92 | + Uint8List pointerList = p.asTypedList(plane0.length); |
93 | + Uint8List pointerList1 = p1.asTypedList(plane1.length); | ||
94 | + Uint8List pointerList2 = p2.asTypedList(plane2.length); | ||
95 | + pointerList.setRange(0, plane0.length, plane0); | ||
96 | + pointerList1.setRange(0, plane1.length, plane1); | ||
97 | + pointerList2.setRange(0, plane2.length, plane2); | ||
84 | 98 | ||
85 | // Call the convertImage function and convert the YUV to RGB | 99 | // Call the convertImage function and convert the YUV to RGB |
86 | - Pointer<Uint32> imgP = _convertImageRGB(p, p1, p2, bytesPerRowPlane1, | ||
87 | - bytesPerPixelPlan1, bytesPerRowPlane0, height, rotationAngle); | 100 | + Pointer<Uint32> imgP = _convertImageYuv420pToRGB( |
101 | + p, | ||
102 | + p1, | ||
103 | + p2, | ||
104 | + bytesPerRowPlane1, | ||
105 | + bytesPerPixelPlan1, | ||
106 | + bytesPerRowPlane0, | ||
107 | + height, | ||
108 | + rotationAngle, | ||
109 | + backGroundColor, | ||
110 | + isFlipVectical, | ||
111 | + isFlipHoriozntal, | ||
112 | + ); | ||
88 | 113 | ||
89 | // Get the pointer of the data returned from the function to a List | 114 | // Get the pointer of the data returned from the function to a List |
90 | List<int> imgData = imgP.asTypedList(((newImgWidth) * (newImgHeight))); | 115 | List<int> imgData = imgP.asTypedList(((newImgWidth) * (newImgHeight))); |
@@ -109,6 +134,9 @@ class IProcessingCameraImage implements ProcessingCameraImage { | @@ -109,6 +134,9 @@ class IProcessingCameraImage implements ProcessingCameraImage { | ||
109 | int? height, | 134 | int? height, |
110 | Uint8List? plane0, | 135 | Uint8List? plane0, |
111 | double? rotationAngle, | 136 | double? rotationAngle, |
137 | + int backGroundColor = 0xFFFFFFFF, | ||
138 | + bool isFlipHoriozntal = false, | ||
139 | + bool isFlipVectical = false, | ||
112 | }) { | 140 | }) { |
113 | if (width == null || height == null || plane0?.isEmpty == null) { | 141 | if (width == null || height == null || plane0?.isEmpty == null) { |
114 | return null; | 142 | return null; |
@@ -126,8 +154,15 @@ class IProcessingCameraImage implements ProcessingCameraImage { | @@ -126,8 +154,15 @@ class IProcessingCameraImage implements ProcessingCameraImage { | ||
126 | Uint8List pointerList = p.asTypedList(plane0?.length ?? 0); | 154 | Uint8List pointerList = p.asTypedList(plane0?.length ?? 0); |
127 | pointerList.setRange(0, plane0?.length ?? 0, plane0 ?? Uint8List(0)); | 155 | pointerList.setRange(0, plane0?.length ?? 0, plane0 ?? Uint8List(0)); |
128 | 156 | ||
129 | - Pointer<Uint32> imgP = | ||
130 | - _convertImageGrayFlutter(p, width, height, rotationAngle); | 157 | + Pointer<Uint32> imgP = _convertImageYuv420pToGray( |
158 | + p, | ||
159 | + width, | ||
160 | + height, | ||
161 | + rotationAngle, | ||
162 | + backGroundColor, | ||
163 | + isFlipVectical, | ||
164 | + isFlipHoriozntal, | ||
165 | + ); | ||
131 | 166 | ||
132 | List<int> imgData = imgP.asTypedList(newImgWidth * newImgHeight); | 167 | List<int> imgData = imgP.asTypedList(newImgWidth * newImgHeight); |
133 | imglib.Image img = | 168 | imglib.Image img = |
@@ -146,6 +181,9 @@ class IProcessingCameraImage implements ProcessingCameraImage { | @@ -146,6 +181,9 @@ class IProcessingCameraImage implements ProcessingCameraImage { | ||
146 | int? height, | 181 | int? height, |
147 | Uint8List? plane0, | 182 | Uint8List? plane0, |
148 | double? rotationAngle, | 183 | double? rotationAngle, |
184 | + int backGroundColor = 0xFF, | ||
185 | + bool isFlipHoriozntal = false, | ||
186 | + bool isFlipVectical = false, | ||
149 | }) { | 187 | }) { |
150 | if (width == null || height == null || plane0?.isEmpty == null) { | 188 | if (width == null || height == null || plane0?.isEmpty == null) { |
151 | return null; | 189 | return null; |
@@ -164,8 +202,15 @@ class IProcessingCameraImage implements ProcessingCameraImage { | @@ -164,8 +202,15 @@ class IProcessingCameraImage implements ProcessingCameraImage { | ||
164 | Uint8List pointerList = p.asTypedList(plane0?.length ?? 0); | 202 | Uint8List pointerList = p.asTypedList(plane0?.length ?? 0); |
165 | pointerList.setRange(0, plane0?.length ?? 0, plane0 ?? Uint8List(0)); | 203 | pointerList.setRange(0, plane0?.length ?? 0, plane0 ?? Uint8List(0)); |
166 | 204 | ||
167 | - Pointer<Uint8> imgP = | ||
168 | - _convertImageGray8BitFlutter(p, width, height, rotationAngle); | 205 | + Pointer<Uint8> imgP = _convertImageYuv420pToGray8Bit( |
206 | + p, | ||
207 | + width, | ||
208 | + height, | ||
209 | + rotationAngle, | ||
210 | + backGroundColor, | ||
211 | + isFlipVectical, | ||
212 | + isFlipHoriozntal, | ||
213 | + ); | ||
169 | 214 | ||
170 | Uint8List imgData = imgP.asTypedList(newImgHeight * newImgWidth); | 215 | Uint8List imgData = imgP.asTypedList(newImgHeight * newImgWidth); |
171 | 216 | ||
@@ -181,17 +226,72 @@ class IProcessingCameraImage implements ProcessingCameraImage { | @@ -181,17 +226,72 @@ class IProcessingCameraImage implements ProcessingCameraImage { | ||
181 | int? width, | 226 | int? width, |
182 | int? height, | 227 | int? height, |
183 | Uint8List? plane0, | 228 | Uint8List? plane0, |
229 | + Uint8List? plane1, | ||
184 | double? rotationAngle, | 230 | double? rotationAngle, |
231 | + int? bytesPerRowPlane0, | ||
232 | + int? bytesPerRowPlane1, | ||
233 | + int? bytesPerPixelPlan1, | ||
234 | + int backGroundColor = 0xFFFFFFFF, | ||
235 | + bool isFlipHoriozntal = false, | ||
236 | + bool isFlipVectical = false, | ||
185 | }) { | 237 | }) { |
186 | - if (width == null || height == null || plane0 == null || plane0.isEmpty) { | 238 | + if (width == null || |
239 | + height == null || | ||
240 | + plane0 == null || | ||
241 | + plane1 == null || | ||
242 | + plane0.isEmpty || | ||
243 | + plane1.isEmpty || | ||
244 | + bytesPerRowPlane0 == null || | ||
245 | + bytesPerRowPlane1 == null || | ||
246 | + bytesPerPixelPlan1 == null) { | ||
187 | return null; | 247 | return null; |
188 | } | 248 | } |
189 | - if (rotationAngle != null) { | ||
190 | - imglib.copyRotate( | ||
191 | - imglib.Image.fromBytes(width, height, List<int>.from(plane0)), | ||
192 | - rotationAngle); | ||
193 | - } | ||
194 | - return imglib.Image.fromBytes(width, height, List<int>.from(plane0)); | 249 | + rotationAngle ??= 0; |
250 | + double rad = | ||
251 | + (rotationAngle * 3.14159265358979323846264338327950288 / 180.0); | ||
252 | + double sinVal = sin(rad).abs(); | ||
253 | + double cosVal = cos(rad).abs(); | ||
254 | + int newImgWidth = (sinVal * height + cosVal * bytesPerRowPlane0).toInt(); | ||
255 | + int newImgHeight = (sinVal * bytesPerRowPlane0 + cosVal * height).toInt(); | ||
256 | + | ||
257 | + // Allocate memory for the 3 planes of the image | ||
258 | + Pointer<Uint8> p = ffi.malloc.allocate(plane0.length); | ||
259 | + Pointer<Uint8> p1 = ffi.malloc.allocate(plane1.length); | ||
260 | + | ||
261 | + // Assign the planes data to the pointers of the image | ||
262 | + Uint8List pointerList = p.asTypedList(plane0.length); | ||
263 | + Uint8List pointerList1 = p1.asTypedList(plane1.length); | ||
264 | + pointerList.setRange(0, plane0.length, plane0); | ||
265 | + pointerList1.setRange(0, plane1.length, plane1); | ||
266 | + | ||
267 | + // Call the convertImage function and convert the YUV to RGB | ||
268 | + Pointer<Uint32> imgP = _convertImageNV12ToRGB( | ||
269 | + p, | ||
270 | + p1, | ||
271 | + bytesPerRowPlane1, | ||
272 | + bytesPerPixelPlan1, | ||
273 | + bytesPerRowPlane0, | ||
274 | + height, | ||
275 | + rotationAngle, | ||
276 | + backGroundColor, | ||
277 | + isFlipVectical, | ||
278 | + isFlipHoriozntal, | ||
279 | + ); | ||
280 | + | ||
281 | + // Get the pointer of the data returned from the function to a List | ||
282 | + final imgData = imgP.asTypedList(((newImgWidth) * (newImgHeight))); | ||
283 | + | ||
284 | + // // Generate image from the converted data | ||
285 | + imglib.Image img = | ||
286 | + imglib.Image.fromBytes(newImgWidth, newImgHeight, imgData); | ||
287 | + | ||
288 | + // Free the memory space allocated | ||
289 | + // from the planes and the converted data | ||
290 | + ffi.malloc.free(p); | ||
291 | + ffi.malloc.free(p1); | ||
292 | + ffi.malloc.free(imgP); | ||
293 | + | ||
294 | + return img; | ||
195 | } | 295 | } |
196 | 296 | ||
197 | /// [processCameraImageToGrayIOS]. for IOS with YUV420. | 297 | /// [processCameraImageToGrayIOS]. for IOS with YUV420. |
@@ -201,12 +301,18 @@ class IProcessingCameraImage implements ProcessingCameraImage { | @@ -201,12 +301,18 @@ class IProcessingCameraImage implements ProcessingCameraImage { | ||
201 | int? height, | 301 | int? height, |
202 | Uint8List? plane0, | 302 | Uint8List? plane0, |
203 | double? rotationAngle, | 303 | double? rotationAngle, |
304 | + int backGroundColor = 0xFFFFFFFF, | ||
305 | + bool isFlipHoriozntal = false, | ||
306 | + bool isFlipVectical = false, | ||
204 | }) { | 307 | }) { |
205 | return processCameraImageToGray( | 308 | return processCameraImageToGray( |
206 | height: height, | 309 | height: height, |
207 | width: width, | 310 | width: width, |
208 | plane0: plane0, | 311 | plane0: plane0, |
209 | rotationAngle: rotationAngle, | 312 | rotationAngle: rotationAngle, |
313 | + backGroundColor: backGroundColor, | ||
314 | + isFlipHoriozntal: isFlipHoriozntal, | ||
315 | + isFlipVectical: isFlipVectical, | ||
210 | ); | 316 | ); |
211 | } | 317 | } |
212 | } | 318 | } |
-
Please register or login to post a comment