我正在使用flutter制作水印图像,我需要将Future转换为Uint8List。
这是发生问题的代码。
child: Image.memory(putWatermarkOnImage(asset))
孩子是在容器小部件和putWatermarkOnImage函数的结果必须是Uint8List类型,而不是未来的类型。
Future<Uint8List> putWatermarkOnImage(asset) async {
final assetFile = await asset.file;
var imageBytes = await assetFile!.readAsBytes();
ByteData watermarkImgByteData = await rootBundle.load('assets/images/ournow_logo.png');
Uint8List watermarkImgBytes = watermarkImgByteData.buffer.asUint8List();
Uint8List imageUint8List = Uint8List.fromList(imageBytes);
Uint8List watermarkedImg = await ImageWatermark.addImageWatermark(
originalImageBytes: imageUint8List,
waterkmarkImageBytes: watermarkImgBytes,
imgHeight: 200,
imgWidth: 200,
dstY: 400,
dstX: 400);
return watermarkedImg;
}
我该如何解决这个问题?
我把你的代码和我写的方式来避免混淆,所以我为你创建了一个类来收集所有字节转换相关的方法,并称之为" byteshandler ">
,然后我重新组织代码如下…我相信它会工作请测试一下,告诉我是否有什么问题
import 'dart:io';
import 'dart:typed_data';
import 'package:flutter/services.dart';
import 'package:wechat_camera_picker/wechat_camera_picker.dart';
Future<Uint8List> putWatermarkOnImage(AssetEntity asset) async {
Uint8List _output;
if (asset != null){
final File assetFile = await asset.file;
final ByteData watermarkImgByteData = await BytesHandlers.getByteDataFromPath('assets/images/ournow_logo.png');
_output = await BytesHandlers.getUint8ListFromFile(assetFile);
_output = await ImageWatermark.addImageWatermark(
originalImageBytes: _output,
waterkmarkImageBytes: watermarkImgByteData,
imgHeight: 200,
imgWidth: 200,
dstY: 400,
dstX: 400
);
}
return _output;
}
class BytesHandlers {
// --------------------
BytesHandlers();
// --------------------
static Future<ByteData> getByteDataFromPath(String assetPath) async {
/// NOTE : Asset path can be local path or url
ByteData _byteData;
if (assetPath != null){
_byteData = await rootBundle.load(assetPath);
}
return _byteData;
}
// --------------------
static Future<Uint8List> getUint8ListFromFile(File file) async {
Uint8List _uInt;
if (file != null){
_uInt = await file.readAsBytes();
}
return _uInt;
}
// --------------------
}
那么你就可以这样称呼它
final Uint8List _ImageWithWatermark = await putWatermarkOnImage(_inputFile);