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 {
    debugPrint('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);
    debugPrint('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);
    debugPrint('ImageProcessor: Image resized to ${_targetWidth}x$_targetHeight');

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

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

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

    debugPrint('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) {
    debugPrint('ImageProcessor: Error processing image - $e');
    throw ImageProcessingException('Failed to process image: $e');
  }
}