wandTransform method
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()})");
}