convertImagesToAvif function

void convertImagesToAvif(
  1. String inputDir,
  2. String outputDir, {
  3. int quality = 60,
  4. bool dryRun = true,
})

Converts all images in inputDir to AVIF using ImageMagick. Output files are written to outputDir.

Requires ImageMagick (magick) to be available in PATH.

Implementation

void convertImagesToAvif(
  String inputDir,
  String outputDir, {
  int quality = 60,
  bool dryRun = true,
}) {
  final inDir = Directory(inputDir);
  if (!inDir.existsSync()) {
    print('Input directory does not exist: $inputDir');
    return;
  }

  final outDir = Directory(outputDir);
  if (!outDir.existsSync()) {
    outDir.createSync(recursive: true);
  }

  const allowedExt = {'jpg', 'jpeg', 'png', 'webp'};

  final files = inDir.listSync().whereType<File>();

  for (final file in files) {
    final name = file.uri.pathSegments.last;
    final lower = name.toLowerCase();

    final dot = lower.lastIndexOf('.');
    if (dot == -1) {
      continue;
    }

    final ext = lower.substring(dot + 1);
    if (!allowedExt.contains(ext)) {
      continue;
    }

    final base = name.substring(0, dot);
    final outputPath = '${outDir.path}${Platform.pathSeparator}$base.avif';

    final cmd = ['magick', file.path, '-quality', quality.toString(), outputPath];

    if (dryRun) {
      print('[dryRun] ${cmd.join(' ')}');
      continue;
    }

    try {
      final result = Process.runSync(cmd.first, cmd.sublist(1), runInShell: true);

      if (result.exitCode == 0) {
        print('Converted: $name → $base.avif');
      } else {
        print('Failed: $name');
        print(result.stderr);
      }
    } catch (e) {
      print('Error converting $name: $e');
    }
  }
}