0
点赞
收藏
分享

微信扫一扫

Flutter照片转换为Uint8List并加水印

转换

在Flutter中,如果你有一个Image widget或者一个File对象,并且想要将其转换为Uint8List(字节列表),你需要通过读取图像文件并将其编码为字节数组。以下是一种常见的方法来实现这个过程:

  1. 首先,确保你已经添加了image_pickerpath_provider插件到你的pubspec.yaml文件中,这样你可以选择图片和获取应用的临时目录。

dependencies:
  flutter:
    sdk: flutter
  image_picker: ^0.8.6+1 # 或者是最新版本
  path_provider: ^2.1.1 # 或者是最新版本
  flutter_image_watermark: ^0.1.0

  1. 接着,使用ImagePicker来获取用户选择的图片:

import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'dart:io';

Future<void> pickImage() async {
  final picker = ImagePicker();
  final pickedFile = await picker.getImage(source: ImageSource.gallery);
  if (pickedFile != null) {
    final imageFile = File(pickedFile.path);
    // 现在你有了一个File对象,可以继续转换成Uint8List
  }
}

  1. 使用path_provider获取应用的临时目录,并将图片读取为Uint8List

import 'package:path_provider/path_provider.dart';
import 'dart:io';
import 'dart:convert';
import 'dart:typed_data';

Future<Uint8List> imageToByteList(File imageFile) async {
  final directory = await getTemporaryDirectory();
  final path = '${directory.path}/${imageFile.path.split('/').last}';
  await imageFile.copy(path);

  final bytes = await File(path).readAsBytes();
  return Uint8List.fromList(bytes);
}

// 使用示例:
pickImage().then((value) => imageToByteList(value).then((byteList) {
  print('Byte List length: ${byteList.length}');
}));

请注意,上述代码示例假设你已经有了一个File类型的图像文件。imageToByteList函数接收这个文件,然后读取它的字节数据并将其转换为Uint8List

如果你直接从网络获取图像,你可以使用http包来获取Uint8List

import 'package:http/http.dart' as http;

Future<Uint8List> getImageBytesFromUrl(String imageUrl) async {
  final response = await http.get(Uri.parse(imageUrl));
  if (response.statusCode == 200) {
    return Uint8List.fromList(response.bodyBytes);
  } else {
    throw Exception('Failed to load image');
  }
}

在你的Flutter文件中,导入所需的类:

 import 'package:flutter/material.dart';
 import 'package:flutter_image_watermark/flutter_image_watermark.dart';
 import 'package:image_picker/image_picker.dart';

接着,定义一个有状态的Widget,比如WatermarkImageWidget

1class WatermarkImageWidget extends StatefulWidget {
2  @override
3  _WatermarkImageWidgetState createState() => _WatermarkImageWidgetState();
4}
5
6class _WatermarkImageWidgetState extends State<WatermarkImageWidget> {
7  File? _imageFile;
8  final ImageWatermarker _watermarker = ImageWatermarker();
9
10  Future<void> _getImage() async {
11    final pickedFile = await ImagePicker().getImage(source: ImageSource.gallery);
12    if (pickedFile != null) {
13      setState(() {
14        _imageFile = File(pickedFile.path);
15      });
16    }
17  }
18
19  void _addWatermark() {
20    if (_imageFile != null) {
21      _watermarker.addText(
22        'Your watermark text here',
23        position: WatermarkPosition.bottomRight,
24        fontSize: 40,
25        color: Colors.white.withOpacity(0.8),
26        angle: 20,
27      ).process(_imageFile!)
28          .then((value) {
29        setState(() {
30          _imageFile = value;
31        });
32      });
33    }
34  }
35  
36  @override
37  Widget build(BuildContext context) {
38    return Scaffold(
39      appBar: AppBar(title: Text('Watermark Image')),
40      body: Center(
41        child: Column(
42          mainAxisAlignment: MainAxisAlignment.center,
43          children: <Widget>[
44            _imageFile != null ? Image.file(_imageFile!) : Text('No image selected.'),
45            SizedBox(height: 30),
46            ElevatedButton(
47              onPressed: _getImage,
48              child: Text('Select Image'),
49            ),
50            SizedBox(height: 20),
51            ElevatedButton(
52              onPressed: _addWatermark,
53              child: Text('Add Watermark'),
54            ),
55          ],
56        ),
57      ),
58    );
59  }
60}

运行和测试

现在,你可以在你的应用程序中使用WatermarkImageWidget来选择图片并添加水印。当用户点击“Select Image”按钮时,应用会打开图库供用户选择图片;点击“Add Watermark”按钮后,所选图片将被添加上文字水印。

注意事项

  • 确保你已经请求了必要的权限,如存储访问权限,以便image_picker插件能够正常工作。
  • flutter_image_watermark插件提供了多种配置选项,包括文字的位置、大小、颜色和旋转角度,可以根据你的需求进行调整。

通过以上步骤,你就可以轻松地在Flutter应用中为图片添加文字水印了!

举报

相关推荐

0 条评论