From 961e0c6da51a5aedc1a4699316d66639a6aef837 Mon Sep 17 00:00:00 2001 From: Mairramer Date: Fri, 22 May 2026 11:54:19 -0300 Subject: [PATCH 1/3] Add rgba8888 format to ImageFormatGroup --- .../camera/camera_platform_interface/CHANGELOG.md | 3 ++- .../lib/src/method_channel/type_conversion.dart | 5 +++++ .../lib/src/types/image_format_group.dart | 11 +++++++++++ .../camera/camera_platform_interface/pubspec.yaml | 2 +- .../test/types/image_group_test.dart | 1 + 5 files changed, 20 insertions(+), 2 deletions(-) diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md index 889501a04383..5417669c2079 100644 --- a/packages/camera/camera_platform_interface/CHANGELOG.md +++ b/packages/camera/camera_platform_interface/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 2.14.0 +* Adds `rgba8888` to `ImageFormatGroup` enum. * Updates minimum supported SDK version to Flutter 3.38/Dart 3.10. ## 2.13.0 diff --git a/packages/camera/camera_platform_interface/lib/src/method_channel/type_conversion.dart b/packages/camera/camera_platform_interface/lib/src/method_channel/type_conversion.dart index 457d7d00ccb4..a402986ffd2c 100644 --- a/packages/camera/camera_platform_interface/lib/src/method_channel/type_conversion.dart +++ b/packages/camera/camera_platform_interface/lib/src/method_channel/type_conversion.dart @@ -37,6 +37,8 @@ ImageFormatGroup _imageFormatGroupFromPlatformData(dynamic data) { return ImageFormatGroup.yuv420; case 256: // android.graphics.ImageFormat.JPEG return ImageFormatGroup.jpeg; + case 1: // android.graphics.PixelFormat.RGBA_8888 + return ImageFormatGroup.rgba8888; } } @@ -47,6 +49,9 @@ ImageFormatGroup _imageFormatGroupFromPlatformData(dynamic data) { case 1111970369: // kCVPixelFormatType_32BGRA return ImageFormatGroup.bgra8888; + + case 1380401729: // kCVPixelFormatType_32RGBA + return ImageFormatGroup.rgba8888; } } diff --git a/packages/camera/camera_platform_interface/lib/src/types/image_format_group.dart b/packages/camera/camera_platform_interface/lib/src/types/image_format_group.dart index 04974ec8bd57..c213f4b89dce 100644 --- a/packages/camera/camera_platform_interface/lib/src/types/image_format_group.dart +++ b/packages/camera/camera_platform_interface/lib/src/types/image_format_group.dart @@ -37,6 +37,15 @@ enum ImageFormatGroup { /// On Android, this is `android.graphics.ImageFormat.NV21`. See /// https://developer.android.com/reference/android/graphics/ImageFormat#NV21 nv21, + + /// 32-bit RGBA. + /// + /// On Android, this is `android.graphics.PixelFormat.RGBA_8888`. See + /// https://developer.android.com/reference/android/graphics/PixelFormat#RGBA_8888 + /// + /// On iOS, this is `kCVPixelFormatType_32RGBA`. See + /// https://developer.apple.com/documentation/corevideo/kcvpixelformattype_32rgba + rgba8888, } /// Extension on [ImageFormatGroup] to stringify the enum @@ -54,6 +63,8 @@ extension ImageFormatGroupName on ImageFormatGroup { return 'jpeg'; case ImageFormatGroup.nv21: return 'nv21'; + case ImageFormatGroup.rgba8888: + return 'rgba8888'; case ImageFormatGroup.unknown: return 'unknown'; } diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml index 804bead11e33..6102c20a7fd4 100644 --- a/packages/camera/camera_platform_interface/pubspec.yaml +++ b/packages/camera/camera_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.13.0 +version: 2.14.0 environment: sdk: ^3.10.0 diff --git a/packages/camera/camera_platform_interface/test/types/image_group_test.dart b/packages/camera/camera_platform_interface/test/types/image_group_test.dart index c6ba9f2cb73e..89dc491498e3 100644 --- a/packages/camera/camera_platform_interface/test/types/image_group_test.dart +++ b/packages/camera/camera_platform_interface/test/types/image_group_test.dart @@ -12,6 +12,7 @@ void main() { expect(ImageFormatGroup.yuv420.name(), 'yuv420'); expect(ImageFormatGroup.jpeg.name(), 'jpeg'); expect(ImageFormatGroup.nv21.name(), 'nv21'); + expect(ImageFormatGroup.rgba8888.name(), 'rgba8888'); expect(ImageFormatGroup.unknown.name(), 'unknown'); }); }); From 2408d73e7d397e4b09cb76380018676c2c603da0 Mon Sep 17 00:00:00 2001 From: Mairramer <50643541+Mairramer@users.noreply.github.com> Date: Fri, 22 May 2026 15:54:25 -0300 Subject: [PATCH 2/3] Update packages/camera/camera_platform_interface/lib/src/types/image_format_group.dart Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../lib/src/types/image_format_group.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_platform_interface/lib/src/types/image_format_group.dart b/packages/camera/camera_platform_interface/lib/src/types/image_format_group.dart index c213f4b89dce..c39ecd16f720 100644 --- a/packages/camera/camera_platform_interface/lib/src/types/image_format_group.dart +++ b/packages/camera/camera_platform_interface/lib/src/types/image_format_group.dart @@ -44,7 +44,7 @@ enum ImageFormatGroup { /// https://developer.android.com/reference/android/graphics/PixelFormat#RGBA_8888 /// /// On iOS, this is `kCVPixelFormatType_32RGBA`. See - /// https://developer.apple.com/documentation/corevideo/kcvpixelformattype_32rgba + /// https://developer.apple.com/documentation/corevideo/1563591-pixel_format_identifiers/kcvpixelformattype_32rgba?language=objc rgba8888, } From 945025327436755e5e90c5e7eef17cf00160a8dd Mon Sep 17 00:00:00 2001 From: Mairramer Date: Fri, 22 May 2026 16:03:44 -0300 Subject: [PATCH 3/3] Add tests for CameraImageData with ImageFormatGroup.rgba8888 for Android and iOS --- .../method_channel/type_conversion_test.dart | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/packages/camera/camera_platform_interface/test/method_channel/type_conversion_test.dart b/packages/camera/camera_platform_interface/test/method_channel/type_conversion_test.dart index 5e578b97b4e5..7e4819d81a00 100644 --- a/packages/camera/camera_platform_interface/test/method_channel/type_conversion_test.dart +++ b/packages/camera/camera_platform_interface/test/method_channel/type_conversion_test.dart @@ -83,4 +83,54 @@ void main() { ); expect(cameraImage.format.group, ImageFormatGroup.yuv420); }); + + test('$CameraImageData has ImageFormatGroup.rgba8888 for Android', () { + debugDefaultTargetPlatformOverride = TargetPlatform.android; + + final CameraImageData cameraImage = cameraImageFromPlatformData( + { + 'format': 1, + 'height': 1, + 'width': 4, + 'lensAperture': 1.8, + 'sensorExposureTime': 9991324, + 'sensorSensitivity': 92.0, + 'planes': [ + { + 'bytes': Uint8List.fromList([1, 2, 3, 4]), + 'bytesPerPixel': 1, + 'bytesPerRow': 4, + 'height': 1, + 'width': 4, + }, + ], + }, + ); + expect(cameraImage.format.group, ImageFormatGroup.rgba8888); + }); + + test('$CameraImageData has ImageFormatGroup.rgba8888 for iOS', () { + debugDefaultTargetPlatformOverride = TargetPlatform.iOS; + + final CameraImageData cameraImage = cameraImageFromPlatformData( + { + 'format': 1380401729, + 'height': 1, + 'width': 4, + 'lensAperture': 1.8, + 'sensorExposureTime': 9991324, + 'sensorSensitivity': 92.0, + 'planes': [ + { + 'bytes': Uint8List.fromList([1, 2, 3, 4]), + 'bytesPerPixel': 1, + 'bytesPerRow': 4, + 'height': 1, + 'width': 4, + }, + ], + }, + ); + expect(cameraImage.format.group, ImageFormatGroup.rgba8888); + }); }