From 3e5323ea3b0defec007cf99e43aa03ed8c6839e8 Mon Sep 17 00:00:00 2001 From: rainyl Date: Wed, 13 Mar 2024 22:07:15 +0800 Subject: [PATCH] update example --- example/lib/main.dart | 145 +++++++++++------- example/pubspec.yaml | 2 +- .../flutter/generated_plugin_registrant.cc | 3 + .../windows/flutter/generated_plugins.cmake | 1 + 4 files changed, 98 insertions(+), 53 deletions(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index 85b6089d..8d557d74 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,10 +1,8 @@ -import 'dart:io'; +import 'dart:async'; import 'dart:typed_data'; -import 'dart:ui' as ui; +import 'package:camera_universal/camera_universal.dart'; import 'package:flutter/material.dart'; -import 'dart:async'; -import 'package:image/image.dart' as img; import 'package:opencv_dart/opencv_dart.dart' as cv; @@ -20,35 +18,49 @@ class MyApp extends StatefulWidget { } class _MyAppState extends State { - cv.Mat? image; + var images = []; + Uint8List? videoFrame; + CameraController cameraController = CameraController(); @override void initState() { super.initState(); + task(); } - Future convertImageToFlutterUi(img.Image image) async { - if (image.format != img.Format.uint8 || image.numChannels != 4) { - final cmd = img.Command() - ..image(image) - ..convert(format: img.Format.uint8, numChannels: 4); - final rgba8 = await cmd.getImageThread(); - if (rgba8 != null) { - image = rgba8; + Future task() async { + await cameraController.initializeCameras(); + await cameraController.initializeCamera( + setState: setState, + ); + await cameraController.activateCamera( + setState: setState, + mounted: () { + return mounted; + }, + ); + } + + void takePicture() async { + var frame = cv.Mat.empty(); + if (cameraController.is_camera_init) { + final im = await cameraController.action_take_picture( + onCameraNotInit: () {}, onCameraNotSelect: () {}, onCameraNotActive: () {}); + if (im != null) { + frame = cv.imread(im.path); } } + if (!frame.isEmpty) { + setState(() { + videoFrame = cv.imencode(cv.ImageFormat.png.ext, frame); + }); + } + } - ui.ImmutableBuffer buffer = await ui.ImmutableBuffer.fromUint8List(image.toUint8List()); - - ui.ImageDescriptor id = ui.ImageDescriptor.raw(buffer, - height: image.height, width: image.width, pixelFormat: ui.PixelFormat.rgba8888); - - ui.Codec codec = await id.instantiateCodec(targetHeight: image.height, targetWidth: image.width); - - ui.FrameInfo fi = await codec.getNextFrame(); - ui.Image uiImage = fi.image; - - return uiImage; + @override + void dispose() { + cameraController.dispose(); + super.dispose(); } @override @@ -61,35 +73,64 @@ class _MyAppState extends State { appBar: AppBar( title: const Text('Native Packages'), ), - body: SingleChildScrollView( - child: Container( - alignment: Alignment.center, - padding: const EdgeInsets.all(10), - child: Column( - children: [ - Image.asset( - "images/lenna.png", - width: 100, - height: 100, + body: Container( + alignment: Alignment.center, + child: Column( + children: [ + Expanded( + flex: 1, + child: Row( + children: [ + Expanded( + child: Camera( + cameraController: cameraController, + onCameraNotInit: (context) { + return const SizedBox.shrink(); + }, + onCameraNotSelect: (context) { + return const SizedBox.shrink(); + }, + onCameraNotActive: (context) { + return const SizedBox.shrink(); + }, + onPlatformNotSupported: (context) { + return const SizedBox.shrink(); + }, + ), + ), + Expanded(child: videoFrame == null ? Text("Empty") : Image.memory(videoFrame!)) + ], + ), + ), + ElevatedButton( + onPressed: () async { + final data = await DefaultAssetBundle.of(context).load("images/lenna.png"); + final im = cv.imdecode(data.buffer.asUint8List(), cv.IMREAD_COLOR); + final gray = cv.Mat.empty(); + cv.cvtColor(im, gray, cv.COLOR_BGR2GRAY); + final blur = cv.Mat.empty(); + cv.gaussianBlur(im, blur, (7, 7), 2, sigmaY: 2); + setState(() { + images = [ + data.buffer.asUint8List(), + cv.imencode(cv.ImageFormat.png.ext, gray), + cv.imencode(cv.ImageFormat.png.ext, blur) + ]; + }); + takePicture(); + }, + child: const Text("Process"), + ), + Expanded( + flex: 2, + child: ListView.builder( + itemCount: images.length, + itemBuilder: (ctx, idx) => Card( + child: Image.memory(images[idx]), + ), ), - spacerSmall, - ElevatedButton( - onPressed: () async { - final data = await DefaultAssetBundle.of(context).load("images/lenna.png"); - setState(() { - image = cv.imdecode(data.buffer.asUint8List(), cv.IMREAD_GRAYSCALE); - }); - }, - child: const Text("Process")), - image == null - ? Text("Image is null!") - : Image.memory( - cv.imencode(cv.ImageFormat.png.ext, image!), - width: 100, - height: 100, - ) - ], - ), + ), + ], ), ), ), diff --git a/example/pubspec.yaml b/example/pubspec.yaml index e86426d4..ff8f81e8 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -37,7 +37,7 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 - image: ^4.1.4 + camera_universal: ^0.0.3 dev_dependencies: flutter_test: diff --git a/example/windows/flutter/generated_plugin_registrant.cc b/example/windows/flutter/generated_plugin_registrant.cc index 8b6d4680..861f5cec 100644 --- a/example/windows/flutter/generated_plugin_registrant.cc +++ b/example/windows/flutter/generated_plugin_registrant.cc @@ -6,6 +6,9 @@ #include "generated_plugin_registrant.h" +#include void RegisterPlugins(flutter::PluginRegistry* registry) { + CameraWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("CameraWindows")); } diff --git a/example/windows/flutter/generated_plugins.cmake b/example/windows/flutter/generated_plugins.cmake index 95d13593..a7cf25c5 100644 --- a/example/windows/flutter/generated_plugins.cmake +++ b/example/windows/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + camera_windows ) list(APPEND FLUTTER_FFI_PLUGIN_LIST