addWatermarkToImage method

  1. @override
Future<String?> addWatermarkToImage(
  1. String imagePath,
  2. MediaOptions options
)
override

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');
  }
}