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