Flutter图片水印插件stamp_image的使用
Flutter图片水印插件stamp_image的使用
stamp_image
是一个用于在图片上添加水印的Flutter库。你可以使用任何小部件来自定义水印的位置,并且可以在一张图片上设置多个水印。
示例用例
- 为从相机或图库获取的图片设置地址名称
- 为产品图片设置公司标志
- 为图片设置温度信息
完整示例Demo
以下是一个完整的示例代码,展示了如何使用 stamp_image
插件来为图片添加水印:
import 'dart:io';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:stamp_image/stamp_image.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Stamp Image',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: HomeScreen(),
);
}
}
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
final picker = ImagePicker();
File? image;
void takePicture() async {
// 从图库中选择图片
final pickedFile = await picker.getImage(source: ImageSource.gallery);
if (pickedFile != null) {
await resetImage();
// 创建水印图片
StampImage.create(
context: context,
image: File(pickedFile.path),
children: [
Positioned(
bottom: 0,
right: 0,
child: _watermarkItem(),
),
Positioned(
top: 0,
left: 0,
child: _logoFlutter(),
)
],
onSuccess: (file) => resultStamp(file),
);
}
}
/// 重置图片文件
Future resetImage() async {
setState(() {
image = null;
});
}
/// 处理水印图片生成完成后的回调
void resultStamp(File? file) {
print(file?.path);
setState(() {
image = file;
});
}
/// 创建时间戳水印
Widget _watermarkItem() {
return Padding(
padding: const EdgeInsets.all(10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(
DateTime.now().toString(),
style: TextStyle(color: Colors.white, fontSize: 15),
),
SizedBox(height: 5),
Text(
"Made By Stamp Image",
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: Colors.blue,
fontWeight: FontWeight.bold,
fontSize: 15,
),
),
],
),
);
}
/// 创建Flutter标志水印
Widget _logoFlutter() {
return Container(
margin: EdgeInsets.all(10),
decoration: BoxDecoration(shape: BoxShape.circle, color: Colors.white),
child: Padding(
padding: const EdgeInsets.all(8),
child: FlutterLogo(),
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Stamp Imager"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
_imageWidget(),
SizedBox(height: 10),
_buttonTakePicture()
],
),
),
);
}
/// 创建“选择图片”按钮
Widget _buttonTakePicture() {
return Container(
margin: EdgeInsets.symmetric(horizontal: 20),
width: MediaQuery.of(context).size.width,
child: ElevatedButton(
onPressed: () => takePicture(),
style: ElevatedButton.styleFrom(
primary: Colors.blue,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(5),
),
),
child: Text(
"选择图片",
style: TextStyle(color: Colors.white, fontSize: 20),
),
),
);
}
/// 显示图片
Widget _imageWidget() {
return Container(
width: MediaQuery.of(context).size.width / 1.1,
child: image != null ? Image.file(image!) : SizedBox(),
);
}
}
保存到指定位置
如果你希望将生成的带有水印的图片自动保存到特定位置,可以使用 path_provider
插件来获取保存路径。以下是修改后的代码示例:
import 'dart:io';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:path_provider/path_provider.dart';
import 'package:stamp_image/stamp_image.dart';
void generate() async {
Directory? directory = await getDownloadsDirectory(); // 获取下载目录
StampImage.create(
context: context,
image: imageFile,
savePath: directory?.path, // 设置保存路径
saveFile: true, // 启用保存功能
children: [
Positioned(
bottom: 0,
right: 0,
child: _watermarkItem(),
),
],
onSuccess: (file) => resultStamp(file),
);
}
更多关于Flutter图片水印插件stamp_image的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter图片水印插件stamp_image的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用stamp_image
插件来为图片添加水印的示例代码。
首先,你需要在pubspec.yaml
文件中添加stamp_image
依赖:
dependencies:
flutter:
sdk: flutter
stamp_image: ^最新版本号 # 请替换为最新的版本号
然后,运行flutter pub get
来安装依赖。
接下来,你可以在你的Dart文件中使用StampImage
来为图片添加水印。以下是一个完整的示例:
import 'package:flutter/material.dart';
import 'package:stamp_image/stamp_image.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Stamp Image Example'),
),
body: Center(
child: FutureBuilder<Uint8List>(
future: _loadImage(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
return Text('Error loading image');
} else {
return StampImage(
image: MemoryImage(snapshot.data!),
stamp: TextStamp(
text: 'Watermark',
color: Colors.red,
fontSize: 24,
alignment: Alignment.bottomRight,
margin: EdgeInsets.all(10),
),
);
}
} else {
return CircularProgressIndicator();
}
},
),
),
),
);
}
Future<Uint8List> _loadImage() async {
// 这里加载一个本地图片,你可以替换为网络图片或其他图片来源
final ByteData bytes = await rootBundle.load('assets/your_image.png');
return bytes.buffer.asUint8List();
}
}
在这个示例中,我们做了以下几件事:
- 在
pubspec.yaml
文件中添加了stamp_image
依赖。 - 使用
FutureBuilder
来异步加载一张图片(这里假设图片在assets
文件夹中,你需要确保图片已被正确添加到assets
并在pubspec.yaml
中声明)。 - 使用
StampImage
小部件将水印添加到加载的图片上。水印使用的是TextStamp
,它允许你指定水印文本、颜色、字体大小、对齐方式和边距。
请确保你的项目中有一个名为assets
的文件夹,并且图片文件(例如your_image.png
)已经被添加到该文件夹中,同时在pubspec.yaml
的flutter
部分下的assets
字段中声明它:
flutter:
assets:
- assets/your_image.png
这样,你就可以在Flutter应用中成功地为图片添加水印了。