analyze static method
Performs comprehensive quality analysis on grayscale image bytes.
imageBytes — Raw grayscale pixel data (1 byte per pixel).
width and height — Image dimensions in pixels.
Implementation
static ScanQualityReport analyze(
Uint8List imageBytes, {
required int width,
required int height,
}) {
final stopwatch = Stopwatch()..start();
final blur = analyzeBlur(imageBytes, width: width, height: height);
final light = analyzeLight(imageBytes);
final skew = analyzeSkew(imageBytes, width: width, height: height);
final contrast = analyzeContrast(imageBytes);
// Calculate overall score as weighted average
final blurWeight = 0.35;
final lightWeight = 0.25;
final skewWeight = 0.15;
final contrastWeight = 0.25;
final blurScore = 1.0 - blur.score;
final lightScore = _lightConditionScore(light.condition);
final skewScore = skew.isAligned ? 1.0 : math.max(0.0, 1.0 - (skew.angleDegrees.abs() / 45.0));
final contrastScore = contrast.isAdequate ? 1.0 : contrast.contrastRatio.clamp(0.0, 1.0);
final overallScore = (blurScore * blurWeight +
lightScore * lightWeight +
skewScore * skewWeight +
contrastScore * contrastWeight)
.clamp(0.0, 1.0);
final grade = _scoreToGrade(overallScore);
final recommendations = _generateRecommendations(blur, light, skew, contrast);
stopwatch.stop();
return ScanQualityReport(
grade: grade,
overallScore: overallScore,
blur: blur,
light: light,
skew: skew,
contrast: contrast,
recommendations: recommendations,
analysisTime: stopwatch.elapsed,
);
}