这是关于Flutter、Dart、Image,特别是drawString函数。
首先,我想做的是用文字(产品名称)为拍摄的图片添加水印。我的意思是不仅仅是将文本放在图像上,而是实际上将其与图片合并,以便用户可以提交图片并在共享产品时共享它。
这样做。我找到了正确的函数drawString(),但问题是它只支持arial48、arial24和arial14字体大小。由于我必须以自定义字体大小编写产品名称,因此我通过计算原始图像的宽度和高度来提取该名称。有没有人以前尝试过这一点或者任何人可以使其成为可能。有谁知道吗
我已经尝试过了。
import 'package:image/image.dart' as img;
img.drawString(originalImage,'$myProductName($pictureTag)',
x: value,
y: value,
color: img.ColorFloat32.rgb(255,255,255), font: img.arial48,
);
但是我需要使用自定义字体大小而不是这些预定义的大小。
我使用的是flutter:3.19.0版本。 和 图片:^4.1.7
请检查一下,这是我针对此问题的解决方案:
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:image/image.dart' as img;
class WatermarkImage extends StatelessWidget {
final String imagePath;
final String productName;
final double fontSize;
WatermarkImage({
required this.imagePath,
required this.productName,
required this.fontSize,
});
@override
Widget build(BuildContext context) {
return FutureBuilder<Uint8List>(
future: _generateWatermarkedImage(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
} else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
} else {
return Image.memory(snapshot.data!);
}
},
);
}
Future<Uint8List> _generateWatermarkedImage() async {
final originalImage = img.decodeImage(await _loadImage());
final scaledImage = img.copyResize(originalImage!, width: originalImage.width, height: originalImage.height);
img.drawString(scaledImage, productName,
x: 10,
y: 10,
color: img.Color.fromRgb(255, 255, 255),
font: img.arial48);
return Uint8List.fromList(img.encodePng(scaledImage));
}
Future<Uint8List> _loadImage() async {
// Load image from file path
final file = File(imagePath);
return await file.readAsBytes();
}
}
void main() {
runApp(MaterialApp(
home: Scaffold(
body: Center(
child: WatermarkImage(
imagePath: 'path_to_your_image.jpg',
productName: 'Your Product Name',
fontSize: 36.0, // Custom font size
),
),
),
));
}