我正在制作一个相机应用程序,它将图片存储到我的 azure 存储帐户并让用户与图片进行交互。
我想要一张
ResolutionPreset.ultraHigh
和一张 ResolutionPreset.low
图片——第一个问题是,ResolutionPreset.low
对我来说有点高(320x240)——也许这可以手动变成 133x100?
第二个问题,我认为控制器输出只能是一张图片。对于第二张图片,需要初始化一个新控制器。
所以这是我现在用于控制器初始化例程的代码:
late CameraController _controller;
late Future<void> _initializeControllerFuture;
@override
void initState() {
super.initState();
// To display the current output from the Camera,
// create a CameraController.
_controller = CameraController(
widget.camera,
ResolutionPreset.low,
);
_initializeControllerFuture = _controller.initialize();
}
这是获取高分辨率图片的功能
Future<XFile> image = _controller.takePicture().whenComplete(() => _controller.dispose());
然后我需要将 XFile 转换为 Uint8List 以将其上传到 azure。 - 到目前为止一切顺利 - 但是下面的代码需要很多时间才能运行,因为
decodeImage
、copyResize
和encodeJpg
以及这些Uint8转换需要很多时间:
Future<String> uploadImageToAzure(Future<XFile> inputimageH) async {
String containerH = "high";
String containerL = "low";
String fileName = (DateTime.now().microsecondsSinceEpoch).toString() + getRandomString(14);
XFile imageH = await inputimageH;
List<int> image_H = await imageH.readAsBytes();
Uint8List pic_hight_uint8= await Uint8List.fromList(image_H);
Image? image_H_IMG = decodeImage(pic_hight_uint8);
Image image_L_IMG = copyResize(image_H_IMG!, height: 200,);
List<int> image_L = encodeJpg(image_L_IMG,quality: 70);
Uint8List pic_low_uint8=Uint8List.fromList(image_L);
await storage.putBlob('/$containerH/$fileName.jpg',bodyBytes: pic_hight_uint8,);
await storage.putBlob('/$containerL/$fileName.jpg',bodyBytes: pic_low_uint8,);
return "OK";
用户打开的图片存储在全局
List<Uint8List>
中,因此当用户关闭和打开所需的案例时,不需要为这个应用程序季节再次重新下载图片。
所以从拍照到显示并上传我做这个数据转换:
XFile
> List<int>
> Uint8List
> Image
> List<int>
> Uint8List
有没有人解决了这个问题,用控制器制作高分辨率和低分辨率的图片,或者有比我更快的调整大小程序吗?
最坏的情况是让高分辨率图片留在季节中并用天蓝色功能调整图片大小?
谢谢!