Skip to content

Commit

Permalink
The ImageOptimizer will now return true when the file could be compre…
Browse files Browse the repository at this point in the history
…ssed otherwise false.
  • Loading branch information
Dirk Lemstra committed Aug 26, 2017
1 parent c0fead0 commit c720c40
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 49 deletions.
33 changes: 19 additions & 14 deletions Source/Magick.NET/Shared/Optimizers/ImageOptimizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,12 @@ private string SupportedFormats
/// smaller the file won't be overwritten.
/// </summary>
/// <param name="file">The image file to compress</param>
public void Compress(FileInfo file)
/// <returns>True when the image could be compressed otherwise false.</returns>
public bool Compress(FileInfo file)
{
Throw.IfNull(nameof(file), file);

DoCompress(file);
return DoCompress(file);
}

/// <summary>
Expand All @@ -69,19 +70,21 @@ public void Compress(FileInfo file)
/// smaller the file won't be overwritten.
/// </summary>
/// <param name="fileName">The file name of the image to compress</param>
public void Compress(string fileName)
/// <returns>True when the image could be compressed otherwise false.</returns>
public bool Compress(string fileName)
{
string filePath = FileHelper.CheckForBaseDirectory(fileName);
Throw.IfNullOrEmpty(nameof(fileName), filePath);

DoCompress(new FileInfo(filePath));
return DoCompress(new FileInfo(filePath));
}

/// <summary>
/// Returns true when the supplied file name is supported based on the extension of the file.
/// </summary>
/// <param name="file">The file to check.</param>
/// <returns>True when the supplied file name is supported based on the extension of the file.</returns>
/// <returns>True when the image could be compressed otherwise false.</returns>
public bool IsSupported(FileInfo file)
{
return IsSupported(MagickFormatInfo.Create(file));
Expand Down Expand Up @@ -120,24 +123,26 @@ public bool IsSupported(string fileName)
/// the file won't be overwritten.
/// </summary>
/// <param name="file">The image file to compress</param>
public void LosslessCompress(FileInfo file)
/// <returns>True when the image could be compressed otherwise false.</returns>
public bool LosslessCompress(FileInfo file)
{
Throw.IfNull(nameof(file), file);

DoLosslessCompress(file);
return DoLosslessCompress(file);
}

/// <summary>
/// Performs lossless compression on the specified file. If the new file size is not smaller
/// the file won't be overwritten.
/// </summary>
/// <param name="fileName">The file name of the image to compress</param>
public void LosslessCompress(string fileName)
/// <returns>True when the image could be compressed otherwise false.</returns>
public bool LosslessCompress(string fileName)
{
string filePath = FileHelper.CheckForBaseDirectory(fileName);
Throw.IfNullOrEmpty(nameof(fileName), filePath);

DoLosslessCompress(new FileInfo(filePath));
return DoLosslessCompress(new FileInfo(filePath));
}

private static Collection<IImageOptimizer> CreateImageOptimizers()
Expand All @@ -160,24 +165,24 @@ private static MagickFormatInfo GetFormatInformation(FileInfo file)
return MagickNET.GetFormatInformation(imageInfo.Format);
}

private void DoLosslessCompress(FileInfo file)
private bool DoLosslessCompress(FileInfo file)
{
IImageOptimizer optimizer = GetOptimizer(file);
if (optimizer == null)
return;
return false;

optimizer.OptimalCompression = OptimalCompression;
optimizer.LosslessCompress(file);
return optimizer.LosslessCompress(file);
}

private void DoCompress(FileInfo file)
private bool DoCompress(FileInfo file)
{
IImageOptimizer optimizer = GetOptimizer(file);
if (optimizer == null)
return;
return false;

optimizer.OptimalCompression = OptimalCompression;
optimizer.Compress(file);
return optimizer.Compress(file);
}

private IImageOptimizer GetOptimizer(FileInfo file)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,18 @@ namespace Magick.NET.Tests
{
public abstract class ImageOptimizerTestHelper
{
protected long AssertCompress(string fileName, bool resultIsSmaller, Action<FileInfo> action)
protected long AssertCompress(string fileName, bool resultIsSmaller, Func<FileInfo, bool> action)
{
using (TemporaryFile tempFile = new TemporaryFile(fileName))
{
long before = tempFile.Length;

action(tempFile);
bool result = action(tempFile);

long after = tempFile.Length;

Assert.AreEqual(resultIsSmaller, result);

if (resultIsSmaller)
Assert.IsTrue(after < before, "{0} is not smaller than {1}", after, before);
else
Expand All @@ -37,17 +39,19 @@ protected long AssertCompress(string fileName, bool resultIsSmaller, Action<File
}
}

protected long AssertCompress(string fileName, bool resultIsSmaller, Action<string> action)
protected long AssertCompress(string fileName, bool resultIsSmaller, Func<string, bool> action)
{
using (TemporaryFile tempFile = new TemporaryFile(fileName))
{
long before = tempFile.Length;

action(tempFile.FullName);
bool result = action(tempFile.FullName);

tempFile.Refresh();
long after = tempFile.Length;

Assert.AreEqual(resultIsSmaller, result);

if (resultIsSmaller)
Assert.IsTrue(after < before, "{0} is not smaller than {1}", after, before);
else
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,16 @@ public abstract class ImageOptimizerTestHelper<TOptimizer> : ImageOptimizerTestH

protected long AssertCompressSmaller(string fileName)
{
bool isCompressed = false;

long lengthA = AssertCompress(fileName, true, (FileInfo file) =>
{
isCompressed = Optimizer.Compress(file);
return Optimizer.Compress(file);
});

long lengthB = AssertCompress(fileName, true, (string file) =>
{
Optimizer.Compress(file);
return Optimizer.Compress(file);
});

Assert.IsTrue(isCompressed);
Assert.AreEqual(lengthA, lengthB, 1);
return lengthA;
}
Expand All @@ -46,12 +43,12 @@ protected void AssertCompressNotSmaller(string fileName)

long lengthA = AssertCompress(fileName, false, (FileInfo file) =>
{
isCompressed = Optimizer.Compress(file);
return Optimizer.Compress(file);
});

long lengthB = AssertCompress(fileName, false, (string file) =>
{
Optimizer.Compress(file);
return Optimizer.Compress(file);
});

Assert.IsFalse(isCompressed);
Expand All @@ -71,44 +68,39 @@ protected void AssertCompressTwice(string fileName)
long after2 = tempFile.Length;

Assert.AreEqual(after1, after2, 1);
Assert.AreNotEqual(compressed1, compressed2);
Assert.IsTrue(compressed1);
Assert.IsFalse(compressed2);
}
}

protected long AssertLosslessCompressSmaller(string fileName)
{
bool isCompressed = false;

long lengthA = AssertCompress(fileName, true, (FileInfo file) =>
{
isCompressed = Optimizer.LosslessCompress(file);
return Optimizer.LosslessCompress(file);
});

long lengthB = AssertCompress(fileName, true, (string file) =>
{
Optimizer.LosslessCompress(file);
return Optimizer.LosslessCompress(file);
});

Assert.IsTrue(isCompressed);
Assert.AreEqual(lengthA, lengthB, 1);
return lengthA;
}

protected void AssertLosslessCompressNotSmaller(string fileName)
{
bool isCompressed = false;

long lengthA = AssertCompress(fileName, false, (FileInfo file) =>
{
isCompressed = Optimizer.LosslessCompress(file);
return Optimizer.LosslessCompress(file);
});

long lengthB = AssertCompress(fileName, false, (string file) =>
{
Optimizer.LosslessCompress(file);
return Optimizer.LosslessCompress(file);
});

Assert.IsFalse(isCompressed);
Assert.AreEqual(lengthA, lengthB);
}

Expand All @@ -125,7 +117,8 @@ protected void AssertLosslessCompressTwice(string fileName)
long after2 = tempFile.Length;

Assert.AreEqual(after1, after2, 1);
Assert.AreNotEqual(compressed1, compressed2);
Assert.IsTrue(compressed1);
Assert.IsFalse(compressed2);
}
}
}
Expand Down
24 changes: 12 additions & 12 deletions Tests/Magick.NET.Tests/Shared/Optimizers/ImageOptimizerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ public void Compress_CanCompressGifFile_FileIsSmaller()
{
AssertCompress(Files.FujiFilmFinePixS1ProGIF, true, (FileInfo file) =>
{
Optimizer.Compress(file);
return Optimizer.Compress(file);
});
}

Expand All @@ -245,7 +245,7 @@ public void Compress_CanCompressJpgFile_FileIsSmaller()
{
AssertCompress(Files.ImageMagickJPG, true, (FileInfo file) =>
{
Optimizer.Compress(file);
return Optimizer.Compress(file);
});
}

Expand All @@ -254,7 +254,7 @@ public void Compress_CanCompressPngFile_FileIsSmaller()
{
AssertCompress(Files.SnakewarePNG, true, (FileInfo file) =>
{
Optimizer.Compress(file);
return Optimizer.Compress(file);
});
}

Expand All @@ -263,7 +263,7 @@ public void Compress_CannotCompressGifFile_FileNotIsSmaller()
{
AssertCompress(Files.RoseSparkleGIF, false, (string file) =>
{
Optimizer.Compress(file);
return Optimizer.Compress(file);
});
}

Expand All @@ -272,7 +272,7 @@ public void Compress_CannotCompressJpgFile_FileIsNotSmaller()
{
AssertCompress(Files.LetterJPG, false, (string file) =>
{
Optimizer.Compress(file);
return Optimizer.Compress(file);
});
}

Expand All @@ -281,7 +281,7 @@ public void Compress_CannotCompressPngFile_FileIsNotSmaller()
{
AssertCompress(Files.MagickNETIconPNG, false, (string file) =>
{
Optimizer.Compress(file);
return Optimizer.Compress(file);
});
}

Expand All @@ -290,7 +290,7 @@ public void LosslessCompress_CanCompressGifFile_FileIsSmaller()
{
AssertCompress(Files.FujiFilmFinePixS1ProGIF, true, (FileInfo file) =>
{
Optimizer.LosslessCompress(file);
return Optimizer.LosslessCompress(file);
});
}

Expand All @@ -299,7 +299,7 @@ public void LosslessCompress_CanCompressJpgFile_FileIsSmaller()
{
AssertCompress(Files.ImageMagickJPG, true, (FileInfo file) =>
{
Optimizer.LosslessCompress(file);
return Optimizer.LosslessCompress(file);
});
}

Expand All @@ -308,7 +308,7 @@ public void LosslessCompress_CanCompressPngFile_FileIsSmaller()
{
AssertCompress(Files.SnakewarePNG, true, (FileInfo file) =>
{
Optimizer.LosslessCompress(file);
return Optimizer.LosslessCompress(file);
});
}

Expand All @@ -317,7 +317,7 @@ public void LosslessCompress_CannotCompressGifFile_FileNotIsSmaller()
{
AssertCompress(Files.RoseSparkleGIF, false, (string file) =>
{
Optimizer.LosslessCompress(file);
return Optimizer.LosslessCompress(file);
});
}

Expand All @@ -326,7 +326,7 @@ public void LosslessCompress_CannotCompressJpgFile_FileIsNotSmaller()
{
AssertCompress(Files.LetterJPG, false, (string file) =>
{
Optimizer.LosslessCompress(file);
return Optimizer.LosslessCompress(file);
});
}

Expand All @@ -335,7 +335,7 @@ public void LosslessCompress_CannotCompressPngFile_FileIsNotSmaller()
{
AssertCompress(Files.MagickNETIconPNG, false, (string file) =>
{
Optimizer.LosslessCompress(file);
return Optimizer.LosslessCompress(file);
});
}
}
Expand Down

0 comments on commit c720c40

Please sign in to comment.