processImage static method

Future<ProcessedImage> processImage(
  1. Uint8List imageBytes, {
  2. String? originalFormat,
})

Processes an image to ensure compatibility with AI vision encoders and prevents corruption issues that cause repeating text patterns.

Implementation

static Future<ProcessedImage> processImage(
  Uint8List imageBytes, {
  String? originalFormat,
}) async {
  try {
    gemmaLog('ImageProcessor: Starting image processing...');

    // Step 1: Validate input
    _validateImageBytes(imageBytes);

    // Step 2: Decode image to check format and get dimensions
    final decodedImage = await _decodeImage(imageBytes);
    gemmaLog(
      'ImageProcessor: Original image - Format: ${originalFormat ?? 'unknown'}, '
      'Width: ${decodedImage.width}, Height: ${decodedImage.height}',
    );

    // Step 3: Resize to target dimensions (896x896 for Gemma 3)
    final resizedImage = await _resizeImage(
      decodedImage,
      _targetWidth,
      _targetHeight,
    );
    gemmaLog(
      'ImageProcessor: Image resized to ${_targetWidth}x$_targetHeight',
    );

    // Step 4: Convert to optimal format (PNG for lossless quality)
    final processedBytes = await _encodeToPng(resizedImage);
    gemmaLog('ImageProcessor: Image converted to PNG format');

    // Step 5: Create Base64 encoded version for transmission
    final base64String = _encodeBase64Safe(processedBytes);
    gemmaLog(
      'ImageProcessor: Base64 encoding completed (${base64String.length} chars)',
    );

    // Step 6: Validate final output
    _validateProcessedImage(processedBytes, base64String);

    gemmaLog('ImageProcessor: Image processing completed successfully');

    return ProcessedImage(
      originalBytes: imageBytes,
      processedBytes: processedBytes,
      base64String: base64String,
      width: _targetWidth,
      height: _targetHeight,
      format: 'png',
      originalFormat: originalFormat ?? detectFormat(imageBytes),
    );
  } catch (e) {
    gemmaLog('ImageProcessor: Error processing image - $e');
    throw ImageProcessingException('Failed to process image: $e');
  }
}