コード例 #1
0
        public static Task <int> Optimize(FileInfo source, FileInfo output)
        {
            using var bytes = new MemoryPoolBufferWriter();

            using (FileStream stream = source.OpenRead())
            {
                ReadAllBytes(stream, bytes);
            }

            var optimizer = new JpegOptimizer();

            optimizer.SetInput(bytes.GetReadOnlySequence());
            optimizer.Scan();

            using var writer = new MemoryPoolBufferWriter();
            optimizer.SetOutput(writer);
            optimizer.Optimize();

            using (FileStream stream = output.OpenWrite())
            {
                WriteAllBytes(writer.GetReadOnlySequence(), stream);
            }

            return(Task.FromResult(0));
        }
コード例 #2
0
        private void CompressJpgImage(TemporaryFile tempFile)
        {
            var jpegOptimizer = new JpegOptimizer();

            if (chkQuality.Checked)
            {
                jpegOptimizer.Compress(tempFile, int.Parse(txtQuality.Text));
            }
            else
            {
                jpegOptimizer.Compress(tempFile);
            }
        }
コード例 #3
0
        public void Optimizing_an_image_will_reduce_the_size()
        {
            var image  = Resources.full;
            var stream = new MemoryStream();

            image.Save(stream, ImageFormat.Jpeg);
            var size   = stream.Length;
            var mImage = new MagickImage(stream);

            var newImage = new Bitmap(Processing.OptimizeImage(mImage));

            newImage.Save(stream, ImageFormat.Jpeg);
            newImage.Save("jpgtan.jpg");
            var newSize = stream.Length;

            var stream1 = new MemoryStream();

            image = Resources.full;
            image.Save(stream1, ImageFormat.Jpeg);
            var outputStream = new MemoryStream();

            stream1.Seek(0, SeekOrigin.Begin);
            using (MagickImage nImage = new MagickImage(stream1))
            {
                nImage.Strip();
                nImage.Resize(1920, 0);
                nImage.Interlace  = Interlace.Plane;
                nImage.Quality    = 80;
                nImage.FilterType = FilterType.Lanczos2;
                nImage.GaussianBlur(0.05, 10);
                nImage.Write(outputStream, MagickFormat.Jpg);
                nImage.AddProfile(ColorProfile.SRGB);
                nImage.Write("MagickNet.jpg");

                nImage.Resize(100, 100);
                var colors = nImage.Histogram().OrderByDescending(h => h.Value);
                nImage.Depth = 8;
                var opt = new JpegOptimizer();
                opt.Progressive = true;
                opt.LosslessCompress("MagickNet.jpg");
                nImage.Quantize(new QuantizeSettings()
                {
                });
                var color = nImage.Histogram().FirstOrDefault().Key.ToColor();
            }
            var newSize1 = outputStream.Length;

            Assert.IsTrue(newSize < size, "Die Bildgröße hat sich nicht geändert");
            Assert.IsTrue(newSize1 < newSize, "Die Bildgröße von Magick war nicht kleiner sich nicht geändert");
        }
コード例 #4
0
                public void ShouldResultInSmallerFileWHenQualityIsSetTo40()
                {
                    using (var tempFile = new TemporaryFile(Files.ImageMagickJPG))
                    {
                        var optimizer = new JpegOptimizer();
                        optimizer.Compress(tempFile.FileInfo);

                        var info = new MagickImageInfo(tempFile.FileInfo);
                        Assert.Equal(85, info.Quality);

                        FileHelper.Copy(Files.ImageMagickJPG, tempFile.FullName);

                        optimizer.Compress(tempFile.FileInfo, 40);

                        info = new MagickImageInfo(tempFile.FileInfo);
                        Assert.Equal(40, info.Quality);
                    }
                }
コード例 #5
0
                public void ShouldResultInSmallerFileWHenQualityIsSetTo40()
                {
                    using (TemporaryFile tempFile = new TemporaryFile(Files.ImageMagickJPG))
                    {
                        JpegOptimizer optimizer = new JpegOptimizer();
                        optimizer.Compress(tempFile);

                        IMagickImageInfo info = new MagickImageInfo(tempFile);
                        Assert.AreEqual(85, info.Quality);

                        File.Copy(Files.ImageMagickJPG, tempFile.FullName, true);

                        optimizer.Compress(tempFile, 40);

                        info = new MagickImageInfo(tempFile);
                        Assert.AreEqual(40, info.Quality);
                    }
                }
コード例 #6
0
        public void TestOptimize(string path, bool strip)
        {
            byte[] jpegBytes = File.ReadAllBytes(path);

            using var refImage = Image.Load <Rgb24>(path);

            var optimizer = new JpegOptimizer();

            optimizer.SetInput(jpegBytes);
            optimizer.Scan();

            var buffer = new ArrayBufferWriter <byte>();

            optimizer.SetOutput(buffer);
            optimizer.Optimize(strip);

            Assert.True(buffer.WrittenCount < jpegBytes.Length);

            using var testImage = Image.Load <Rgb24>(buffer.WrittenSpan);

            AssertEqual(refImage, testImage);
        }
コード例 #7
0
        public void Test_Compress_Quality()
        {
            FileInfo tempFile = CreateTemporaryFile(Files.ImageMagickJPG);

            try
            {
                JpegOptimizer optimizer = new JpegOptimizer();
                optimizer.Compress(tempFile);

                IMagickImageInfo info = new MagickImageInfo(tempFile);
                Assert.AreEqual(85, info.Quality);

                File.Copy(Files.ImageMagickJPG, tempFile.FullName, true);

                optimizer.Compress(tempFile, 40);

                info = new MagickImageInfo(tempFile);
                Assert.AreEqual(40, info.Quality);
            }
            finally
            {
                tempFile.Delete();
            }
        }
コード例 #8
0
ファイル: OptimizeImage.cs プロジェクト: udt1106/Dianoga
        public void Process(GetMediaStreamPipelineArgs args)
        {
            Assert.ArgumentNotNull(args, "args");

            if (args.Options.Thumbnail)
            {
                return;
            }

            MediaStream outputStream = args.OutputStream;

            if (outputStream == null)
            {
                return;
            }

            if (!outputStream.AllowMemoryLoading)
            {
                Tracer.Error("Could not resize image as it was larger than the maximum size allowed for memory processing. Media item: {0}", outputStream.MediaItem.Path);
                return;
            }

            string mimeType = args.MediaData.MimeType;

            if (!mimeType.StartsWith("image/", StringComparison.Ordinal))
            {
                return;
            }

            string extension = args.MediaData.Extension;

            IImageOptimizer optimizer = null;

            if (extension.Equals("png"))
            {
                optimizer = new PngOptimizer(outputStream.Stream);
            }

            if (extension.Equals("jpg") || extension.Equals("jpeg"))
            {
                optimizer = new JpegOptimizer(outputStream.Stream);
            }

            if (optimizer == null)
            {
                return;
            }

            var sw = new Stopwatch();

            sw.Start();

            var result = optimizer.Optimize();

            sw.Stop();

            if (result.Success)
            {
                outputStream.Stream.Close();

                Log.Info("Dianoga: optimized {0}.{1} ({2} bytes) - saved {3} bytes / {4:p}. Optimized in {5}ms.".FormatWith(args.OutputStream.MediaItem.MediaPath, args.OutputStream.MediaItem.Extension, result.SizeAfter, result.SizeBefore - result.SizeAfter, 1 - ((result.SizeAfter / (float)result.SizeBefore)), sw.ElapsedMilliseconds), this);

                args.OutputStream = new MediaStream(result.CreateResultStream(), outputStream.Extension, outputStream.MediaItem);
            }
            else
            {
                Log.Error("Dianoga: unable to optimize {0} because {1}".FormatWith(args.OutputStream.MediaItem.Name, result.ErrorMessage), this);
            }
        }