wandTransform method

  1. @override
Future<void> wandTransform(
  1. MediaPipeline pipeline,
  2. MagickWand wand
)
override

Implementation

@override
Future<void> wandTransform(MediaPipeline pipeline, MagickWand wand) async {
  (int, int) inSize =
      (wand.magickGetImageWidth(), wand.magickGetImageHeight());
  (int, int) outSize = _imageScale(inSize.$1, inSize.$2, maxDimension);
  wand.magickSetInterpolateMethod(interpolateMethod);
  wand.magickSetImageInterpolateMethod(interpolateMethod);
  wand.magickSetImageCompression(CompressionType.WebPCompression);
  wand.magickSetImageFormat("webp");
  int quality = initialQuality;
  int att = maxAttempts;
  double stepMultiplier = initialStepMultiplier;
  wand.magickSetImageCompressionQuality(quality);
  await wand.magickScaleImage(columns: outSize.$1, rows: outSize.$2);
  inSize = outSize;
  int tooBig = 101;
  int tooSmall = 0;

  while (att-- > 0) {
    await wand.magickWriteImage(output.path);
    print(
        "Attempt Left $att: $quality% is ${output.lengthSync().readableFileSize()} of ${maxBytes.readableFileSize()}");

    int oq = quality;
    if (output.lengthSync() <= maxBytes) {
      if (quality >= plentifulSpaceQualityThreshold) {
        print("Quality is plentiful at $quality%");
        break;
      }
      tooSmall = quality;
      quality = max(min(tooBig - 1, (quality * stepMultiplier)), tooSmall + 1)
          .round();
    } else {
      tooBig = quality;
      quality ~/= stepMultiplier;
    }

    if (quality == oq) {
      print("Same Quality result... stopping at $quality%");
      break;
    }

    wand.magickSetImageCompressionQuality(quality);
    stepMultiplier = pow(stepMultiplier, 0.69).toDouble();
    if (stepMultiplier < stepMultiplierCutoff) {
      print("We're getting nowhere, stopping at $quality%");
      break;
    }
  }
  await wand.magickWriteImage(output.path);

  print(
      "Optimal Compression for ${output.path} is $quality% (${((output.lengthSync() / maxBytes * 100)).toStringAsFixed(2)}% of target ${maxBytes.readableFileSize()})");
}