addWatermarkToImage method
Implementation
@override
Future<String?> addWatermarkToImage(
String imagePath, MediaOptions options) async {
try {
// Check if watermark is specified
if (options.watermark == null || options.watermark!.isEmpty) {
throw Exception('Watermark text is required');
}
// For web, the imagePath could be a data URL, blob URL, or object URL
final img = web.HTMLImageElement();
final completer = Completer<String?>();
img.onLoad.listen((_) async {
try {
final canvas = web.HTMLCanvasElement();
canvas.width = img.naturalWidth;
canvas.height = img.naturalHeight;
final ctx = canvas.getContext('2d') as web.CanvasRenderingContext2D;
// Draw the original image
ctx.drawImage(img, 0, 0);
// Add watermark
_drawWatermark(ctx, canvas.width, canvas.height, options);
// Convert to data URL with quality settings
final quality =
(options.imageQuality.clamp(0, 100)).toDouble() / 100.0;
final dataUrl = canvas.toDataURL('image/jpeg', quality as dynamic);
completer.complete(dataUrl);
} catch (e) {
completer
.completeError(Exception('Failed to add watermark to image: $e'));
}
});
img.onError.listen((_) {
completer.completeError(Exception('Failed to load image'));
});
img.src = imagePath;
return await completer.future;
} catch (e) {
throw Exception('Error adding watermark to image: $e');
}
}