editImage method

  1. @override
Future<ImageGenerationResponse> editImage(
  1. ImageEditRequest request
)
override

Edit an existing image based on a prompt

Creates an edited or extended image given an original image and a prompt. The original image must have transparent areas that indicate where to edit.

Implementation

@override
Future<ImageGenerationResponse> editImage(ImageEditRequest request) async {
  // Google supports image editing through Gemini conversational approach
  final model = _config.model;
  final endpoint = 'models/$model:generateContent';

  // Convert image to base64 for inline data
  String? imageBase64;
  String? mimeType;

  if (request.image.data != null) {
    imageBase64 = base64Encode(request.image.data!);
    mimeType = _getMimeTypeFromFormat(request.image.format ?? 'png');
  } else if (request.image.url != null) {
    throw UnsupportedError(
        'Google image editing does not support URL inputs, only direct image data');
  }

  if (imageBase64 == null) {
    throw ArgumentError('Image data is required for Google image editing');
  }

  final requestData = {
    'contents': [
      {
        'parts': [
          {'text': request.prompt},
          {
            'inlineData': {
              'mimeType': mimeType,
              'data': imageBase64,
            }
          }
        ]
      }
    ],
    'generationConfig': {
      'responseModalities': ['TEXT', 'IMAGE'],
      if (request.count != null) 'candidateCount': request.count,
      if (_config.temperature != null) 'temperature': _config.temperature,
    },
    if (_config.safetySettings != null)
      'safetySettings':
          _config.safetySettings!.map((s) => s.toJson()).toList(),
  };

  try {
    final response = await _client.postJson(endpoint, requestData);
    return _parseGeminiResponse(response, model);
  } catch (e) {
    _logger.severe('Google image editing failed: $e');
    rethrow;
  }
}