diff --git a/CompressImagesFunction/CompressImages.cs b/CompressImagesFunction/CompressImages.cs index 5e28459ac..a9e266ad8 100644 --- a/CompressImagesFunction/CompressImages.cs +++ b/CompressImagesFunction/CompressImages.cs @@ -20,6 +20,7 @@ public static class CompressImages { new ImageMagickCompress(), new SvgoCompress(), + new MozJpegCompress(), }; public static bool Run(CompressimagesParameters parameters, ILogger logger) @@ -177,6 +178,7 @@ private static CompressionResult[] OptimizeImages(Repository repo, string localP if (aggressiveCompression) { optimizer.LossyCompress(image); + optimizer.LosslessCompress(image); } else { diff --git a/CompressImagesFunction/Compressors/MozJpegCompress.cs b/CompressImagesFunction/Compressors/MozJpegCompress.cs new file mode 100644 index 000000000..a556a941c --- /dev/null +++ b/CompressImagesFunction/Compressors/MozJpegCompress.cs @@ -0,0 +1,46 @@ +using System.Diagnostics; +using System.IO; + +namespace CompressImagesFunction.Compressors +{ + public class MozJpegCompress : ICompress + { + private static readonly string LosslessPlugin = "mozjpegtran"; + private static readonly string LossyPlugin = "mozcjpeg"; + + public string[] SupportedExtensions => + new[] { ".jpg", ".jpeg" }; + + public void LosslessCompress(string path) + { + var arguments = $"-outfile {path}"; + Compress(LosslessPlugin, arguments); + } + + public void LossyCompress(string path) + { + var tempPath = path + ".tmp"; + var arguments = $"-quality 80 -outfile {tempPath} {path}"; + + Compress(LossyPlugin, arguments); + + File.Delete(path); + File.Move(tempPath, path); + } + + private void Compress(string compressionType, string arguments) + { + var processStartInfo = new ProcessStartInfo + { + UseShellExecute = false, + CreateNoWindow = true, + FileName = compressionType, + Arguments = arguments, + }; + using (var process = Process.Start(processStartInfo)) + { + process.WaitForExit(10000); + } + } + } +} diff --git a/Dockerfile.CompressImages b/Dockerfile.CompressImages index 2134179b3..911ef7506 100644 --- a/Dockerfile.CompressImages +++ b/Dockerfile.CompressImages @@ -11,11 +11,21 @@ RUN cd /src/CompressImagesFunction && cp bin/Release/netstandard2.0/bin/runtimes FROM mcr.microsoft.com/azure-functions/dotnet:2.0 RUN apt-get update && apt-get install -y --no-install-recommends --no-install-suggests \ - curl libcurl3 + curl libcurl3 autoconf automake libtool nasm make wget pkg-config RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - RUN apt-get install -y nodejs RUN npm install -g svgo@^1.3.0 +# Add support for mozjpeg +RUN cd /tmp && wget https://github.com/mozilla/mozjpeg/archive/v3.3.1.tar.gz +RUN cd /tmp && tar -xzf v3.3.1.tar.gz +RUN cd /tmp/mozjpeg-3.3.1 && autoreconf -fiv +RUN mkdir /tmp/mozjpeg-3.3.1/build +RUN cd /tmp/mozjpeg-3.3.1/build && sh ../configure && make install + +RUN ln -s /opt/mozjpeg/bin/jpegtran /usr/local/bin/mozjpegtran +RUN ln -s /opt/mozjpeg/bin/cjpeg /usr/local/bin/mozcjpeg + ENV AzureWebJobsScriptRoot=/home/site/wwwroot COPY --from=dotnet ["/home/site/wwwroot", "/home/site/wwwroot"]