Ejemplo n.º 1
0
        private static async Task process(TaskCompletionSource <ArraySegment <byte> > tcs, string reqPath, string cachePath, ProcessImageSettings s)
        {
            try
            {
                if (reqPath == WebRSizeModule.NotFoundPath)
                {
                    using (await enterWorkQueueAsync())
                        using (var oimg = new MemoryStream(8192))
                        {
#pragma warning disable 0618 // obsolete
                            GdiImageProcessor.CreateBrokenImage(oimg, s);
#pragma warning restore 0618
                            oimg.Position = 0;
                            saveResult(tcs, oimg, cachePath, DateTime.MinValue);
                            return;
                        }
                }

                var vpp = HostingEnvironment.VirtualPathProvider;

                var file = vpp is CachingAsyncVirtualPathProvider vppAsync ? await vppAsync.GetFileAsync(reqPath) : vpp.GetFile(reqPath);

                var afile = file as AsyncVirtualFile;

                var lastWrite = afile?.LastModified ?? DateTime.MinValue;
                if (lastWrite == DateTime.MinValue && mpbvfType.Value.IsAssignableFrom(file.GetType()))
                {
                    lastWrite = File.GetLastWriteTimeUtc(HostingEnvironment.MapPath(reqPath));
                }

                using (var iimg = afile != null ? await afile.OpenAsync() : file.Open())
                    using (await enterWorkQueueAsync())
                        using (var oimg = new MemoryStream(16384))
                        {
                            MagicImageProcessor.ProcessImage(iimg, oimg, s);

                            saveResult(tcs, oimg, cachePath, lastWrite);
                        }
            }
            catch (Exception ex)
            {
                tcs.SetException(ex);

                tdic.TryRemove(cachePath, out _);
            }
        }
    private void RunTests(string inFile)
    {
        bool breakup    = false;
        var  inFileInfo = new FileInfo(inFile);

        var settings = new ProcessImageSettings {
            Width       = 400,
            Height      = 0,
            Sharpen     = false,
            JpegQuality = 90,
            ResizeMode  = CropScaleMode.Crop,
            SaveFormat  = FileFormat.Jpeg,
            //BlendingMode = GammaMode.sRGB,
            //HybridMode = HybridScaleMode.Turbo,
            //Interpolation = InterpolationSettings.Cubic,
            //MatteColor = Color.Pink,
            //Anchor = CropAnchor.Bottom | CropAnchor.Right,
        };

        var inImage = File.ReadAllBytes(inFileInfo.FullName);

        new ImageResizer.Plugins.FastScaling.FastScalingPlugin().Install(ImageResizer.Configuration.Config.Current);
        //new ImageResizer.Plugins.PrettyGifs.PrettyGifs().Install(ImageResizer.Configuration.Config.Current);

        int speed = settings.HybridMode == HybridScaleMode.Off ? -2 : settings.HybridMode == HybridScaleMode.FavorQuality ? 0 : settings.HybridMode == HybridScaleMode.FavorSpeed ? 2 : 4;
        //string filter = settings.Interpolation.Equals(InterpolationSettings.Cubic) ? "cubic" : settings.Interpolation.Equals(InterpolationSettings.Linear) ? "linear" : "";
        string anchor1 = (settings.Anchor & CropAnchor.Top) == CropAnchor.Top ? "top" : (settings.Anchor & CropAnchor.Bottom) == CropAnchor.Bottom ? "bottom" : "middle";
        string anchor2 = (settings.Anchor & CropAnchor.Left) == CropAnchor.Left ? "left" : (settings.Anchor & CropAnchor.Right) == CropAnchor.Right ? "right" : "center";
        string bgcolor = settings.MatteColor == Color.Empty ? null : $"&bgcolor={settings.MatteColor.ToKnownColor()}";
        string quality = settings.JpegQuality == 0 ? null : $"&quality={settings.JpegQuality}";
        string format  = settings.SaveFormat == FileFormat.Png8 ? "gif" : settings.SaveFormat.ToString();
        var    irs     = new ResizeSettings($"width={settings.Width}&height={settings.Height}&mode={settings.ResizeMode}&anchor={anchor1}{anchor2}&autorotate=true{bgcolor}&scale=both&format={format}&quality={settings.JpegQuality}&fastscale=true&down.speed={speed}");

        Func <Stream> gdi = () => { using (var msi = new MemoryStream(inImage)) { var mso = new MemoryStream(16384); GdiImageProcessor.ProcessImage(msi, mso, settings); return(mso); } };
        Func <Stream> mag = () => { using (var msi = new MemoryStream(inImage)) { var mso = new MemoryStream(16384); MagicImageProcessor.ProcessImage(msi, mso, settings); return(mso); } };
        Func <Stream> wic = () => { using (var msi = new MemoryStream(inImage)) { var mso = new MemoryStream(16384); WicImageProcessor.ProcessImage(msi, mso, settings); return(mso); } };
        Func <Stream> irf = () => { using (var msi = new MemoryStream(inImage)) { var mso = new MemoryStream(16384); ImageBuilder.Current.Build(msi, mso, irs); return(mso); } };

        try
        {
            var irfimg = Task.Run(irf).Result;
            var gdiimg = Task.Run(gdi).Result;
            var wicimg = Task.Run(wic).Result;
            var magimg = Task.Run(mag).Result;

            File.WriteAllBytes($"imgirf.{settings.SaveFormat.ToString().ToLower()}", ((MemoryStream)irfimg).ToArray());
            File.WriteAllBytes($"imggdi.{settings.SaveFormat.ToString().ToLower()}", ((MemoryStream)gdiimg).ToArray());
            File.WriteAllBytes($"imgmag.{settings.SaveFormat.ToString().ToLower()}", ((MemoryStream)magimg).ToArray());
            File.WriteAllBytes($"imgwic.{settings.SaveFormat.ToString().ToLower()}", ((MemoryStream)wicimg).ToArray());

            irfimg.Position = gdiimg.Position = wicimg.Position = magimg.Position = 0;

            img1.Source = BitmapFrame.Create(irfimg, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
            img2.Source = BitmapFrame.Create(gdiimg, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
            img3.Source = BitmapFrame.Create(wicimg, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
            img4.Source = BitmapFrame.Create(magimg, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);

            if (breakup)
            {
                GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
                GC.Collect(2, GCCollectionMode.Forced, true);
                Thread.Sleep(1000);
            }

            runTest(irf, $"FastScaling Auto {(speed == -2 ? null : "(speed=" + speed + ")")}", lbl1, breakup);
            runTest(gdi, $"GDI+ HighQualityBicubic {(settings.HybridMode == HybridScaleMode.Off ? null : " Hybrid (" + settings.HybridMode + ")")}", lbl2, breakup);
            runTest(wic, $"WIC Fant", lbl3, breakup);
            runTest(mag, $"MagicScaler {(settings.HybridMode == HybridScaleMode.Off ? null : " Hybrid (" + settings.HybridMode + ")")}", lbl4, breakup);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }