public void ExactSizeShouldEqualExactSize()
        {
            var request = new Image.Common.ImageRequest("", new ImageRegion(ImageRegionMode.Region, 500, 500, 500, 500), new ImageSize(ImageSizeMode.Distort, 1, 500, 500), new ImageRotation(0, false), ImageQuality.@default, ImageFormat.jpg);
            var result  = ImageRequestInterpreter.GetInterpretedValues(request, 2000, 2000, false);

            Assert.AreEqual(500, result.StartX);
            Assert.AreEqual(500, result.StartY);
            Assert.AreEqual(500, result.RegionWidth);
            Assert.AreEqual(500, result.RegionHeight);
        }
        public void PercentageRegionFullSize()
        {
            var request = new Image.Common.ImageRequest("", new ImageRegion(ImageRegionMode.PercentageRegion, 50, 50, 50, 50), new ImageSize(ImageSizeMode.Max, 1), new ImageRotation(0, false));
            var result  = ImageRequestInterpreter.GetInterpretedValues(request, 2000, 2000, false);

            Assert.AreEqual(1000, result.StartX);
            Assert.AreEqual(1000, result.StartY);
            Assert.AreEqual(1000, result.RegionWidth);
            Assert.AreEqual(1000, result.RegionHeight);
        }
        public void Full_Full()
        {
            var request = new Image.Common.ImageRequest("", new ImageRegion(ImageRegionMode.Full), new ImageSize(ImageSizeMode.Max, 1), new ImageRotation(0, false), ImageQuality.@default, ImageFormat.jpg);
            var result  = ImageRequestInterpreter.GetInterpretedValues(request, width, height, false);

            Assert.AreEqual(0, result.StartX, "Expected x offset does not match calculated x offset");
            Assert.AreEqual(0, result.StartY, "Expected y offset does not match calculated y offset");
            Assert.AreEqual(width, result.RegionWidth, "Expected region width does not match calculated region width");
            Assert.AreEqual(height, result.RegionHeight, "Expected region height does not match calculated region height");
        }
        public void Full_Expanded_Yes_size_Above_Full_Max_Height()
        {
            var request = new Image.Common.ImageRequest("", new ImageRegion(ImageRegionMode.Full), new ImageSize(ImageSizeMode.Distort, 1, width * 2, height * 4), new ImageRotation(90, false), ImageQuality.@default, ImageFormat.jpg, int.MaxValue, 300, int.MaxValue);
            var result  = ImageRequestInterpreter.GetInterpretedValues(request, width, height, true);

            Assert.AreEqual(0, result.StartX);
            Assert.AreEqual(0, result.StartY);
            Assert.AreEqual(width, result.RegionWidth, "Expected region width does not match calculated width");
            Assert.AreEqual(height, result.RegionHeight, "Expected region height does not match calculated height");
            Assert.AreEqual(225, result.OutputWidth, "Expected width does not match calculated width");
            Assert.AreEqual(300, result.OutputHeight, "Expected height does not match calculated height");
        }
        public void Full_Max_MaxWidth_MaxHeight_Exact()
        {
            var request = new Image.Common.ImageRequest("", new ImageRegion(ImageRegionMode.Full), new ImageSize(ImageSizeMode.MaintainAspectRatio, 1, 0, 2000), new ImageRotation(0, false), ImageQuality.@default, ImageFormat.jpg, 1000, 1000, int.MaxValue);
            var result  = ImageRequestInterpreter.GetInterpretedValues(request, 6640, 4007, false);

            Assert.AreEqual(0, result.StartX);
            Assert.AreEqual(0, result.StartY);
            Assert.AreEqual(6640, result.RegionWidth, "Expected region width does not match calculated region width");
            Assert.AreEqual(4007, result.RegionHeight, "Expected region height does not match calculated region height");
            Assert.AreEqual(1000, result.OutputWidth, "Expected region width does not match calculated region width");
            Assert.AreEqual(604, result.OutputHeight, "Expected region height does not match calculated region height");
        }
        public void Full_Expanded_No_size_Above_Full_Max_Width()
        {
            var request = new Image.Common.ImageRequest("", new ImageRegion(ImageRegionMode.Full), new ImageSize(ImageSizeMode.MaintainAspectRatio, 1, width, height), new ImageRotation(90, false), ImageQuality.@default, ImageFormat.jpg, 200, int.MaxValue, int.MaxValue);
            var result  = ImageRequestInterpreter.GetInterpretedValues(request, width, height, false);

            Assert.AreEqual(0, result.StartX);
            Assert.AreEqual(0, result.StartY);
            Assert.AreEqual(width, result.RegionWidth, "Expected width does not match calculated width");
            Assert.AreEqual(height, result.RegionHeight, "Expected height does not match calculated height");
            Assert.AreEqual(200, result.OutputWidth, "Expected width does not match calculated width");
            Assert.AreEqual(133, result.OutputHeight, "Expected height does not match calculated height");
        }
        public void Pct_region_full_No_size_Above_Full_maxWidth()
        {
            var request = new Image.Common.ImageRequest("", new ImageRegion(ImageRegionMode.PercentageRegion, 0, 0, 100, 100), new ImageSize(ImageSizeMode.Max, 1), new ImageRotation(0, false), ImageQuality.@default, ImageFormat.jpg, 150, int.MaxValue, int.MaxValue);
            var result  = ImageRequestInterpreter.GetInterpretedValues(request, width, height, false);

            Assert.AreEqual(0, result.StartX);
            Assert.AreEqual(0, result.StartY);
            Assert.AreEqual(width, result.RegionWidth, "Expected width does not match calculated width");
            Assert.AreEqual(height, result.RegionHeight, "Expected height does not match calculated height");
            Assert.AreEqual(150, result.OutputWidth, "Expected width does not match calculated width");
            Assert.AreEqual(100, result.OutputHeight, "Expected height does not match calculated height");
        }
        public void Full_Pct_Expanded_Yes_size_Above_Full()
        {
            var request = new Image.Common.ImageRequest("", new ImageRegion(ImageRegionMode.Full), new ImageSize(ImageSizeMode.PercentageScaled, 2), new ImageRotation(90, false), ImageQuality.@default, ImageFormat.jpg);
            var result  = ImageRequestInterpreter.GetInterpretedValues(request, width, height, true);

            Assert.AreEqual(0, result.StartX);
            Assert.AreEqual(0, result.StartY);
            Assert.AreEqual(width, result.RegionWidth);
            Assert.AreEqual(height, result.RegionHeight);
            Assert.AreEqual(width * 2, result.OutputWidth, "Expected width does not match calculated width");
            Assert.AreEqual(height * 2, result.OutputHeight, "Expected height does not match calculated height");
        }
 public void CheckBounds_InvalidRegion()
 {
     var request = new Image.Common.ImageRequest
                   (
         "",
         new ImageRegion(ImageRegionMode.Region, 0, 0, 0, 100),
         new ImageSize(ImageSizeMode.Distort, 1, 100, 100),
         new ImageRotation(0, false),
         ImageQuality.@default,
         ImageFormat.jpg
                   );
     var result = ImageRequestInterpreter.GetInterpretedValues(request, width, height, false);
 }
        public void Full_Pct_Expanded_No_size_Above_Full()
        {
            var request = new Image.Common.ImageRequest
                          (
                "",
                new ImageRegion(ImageRegionMode.Full),
                new ImageSize(ImageSizeMode.PercentageScaled, 2),
                new ImageRotation(0, false),
                ImageQuality.@default,
                ImageFormat.jpg
                          );
            var result = ImageRequestInterpreter.GetInterpretedValues(request, width, height, false);

            Assert.AreEqual(0, result.StartX);
            Assert.AreEqual(0, result.StartY);
            Assert.AreEqual(width, result.RegionWidth);
            Assert.AreEqual(height, result.RegionHeight);
        }
        public void Full_Rotated_90()
        {
            var request = new Image.Common.ImageRequest
                          (
                "",
                new ImageRegion(ImageRegionMode.Full),
                new ImageSize(ImageSizeMode.Max, 1, 0, 0),
                new ImageRotation(0, false),
                ImageQuality.@default,
                ImageFormat.jpg
                          );
            var result = ImageRequestInterpreter.GetInterpretedValues(request, width, height, false);

            Assert.AreEqual(0, result.StartX);
            Assert.AreEqual(0, result.StartY);
            Assert.AreEqual(width, result.RegionWidth);
            Assert.AreEqual(height, result.RegionHeight);
        }
        private static (ProcessState state, SKImage image) ReadFullImage(T.Tiff tiff, ImageRequest request, bool allowSizeAboveFull)
        {
            int width  = tiff.GetField(T.TiffTag.IMAGEWIDTH)[0].ToInt();
            int height = tiff.GetField(T.TiffTag.IMAGELENGTH)[0].ToInt();

            var restag  = tiff.GetField(T.TiffTag.RESOLUTIONUNIT);
            var xrestag = tiff.GetField(T.TiffTag.XRESOLUTION);
            var yrestag = tiff.GetField(T.TiffTag.YRESOLUTION);

            var resunit = restag == null ? 2 : restag[0].ToShort();
            var xres    = xrestag == null ? 96 : xrestag[0].ToDouble();
            var yres    = yrestag == null ? 96 : yrestag[0].ToDouble();

            // pixels per metre
            if (resunit == 3)
            {
                xres = xres / 0.0254;
                yres = yres / 0.0254;
            }

            var isTileable = tiff.IsTiled();
            var state      = ImageRequestInterpreter.GetInterpretedValues(request, width, height, allowSizeAboveFull);

            state.HorizontalResolution = Convert.ToUInt16(xres);
            state.VerticalResolution   = Convert.ToUInt16(yres);
            var raster = new int[width * height];

            if (!tiff.ReadRGBAImageOriented(width, height, raster, T.Orientation.TOPLEFT))
            {
                throw new IOException("Unable to decode TIFF file");
            }
            using (var bmp = CreateBitmapFromPixels(raster, width, height))
            {
                var desiredWidth  = Math.Max(1, (int)Math.Round(state.RegionWidth * state.ImageScale));
                var desiredHeight = Math.Max(1, (int)Math.Round(state.RegionHeight * state.ImageScale));
                Log.Debug("Desired size {@DesiredWidth}, {@DesiredHeight}", desiredWidth, desiredHeight);

                var regionWidth  = state.RegionWidth;
                var regionHeight = state.RegionHeight;

                var srcRegion = SKRectI.Create(state.StartX, state.StartY, regionWidth, regionHeight);
                return(state, CopyImageRegion2(bmp, desiredWidth, desiredHeight, srcRegion));
            }
        }
        public void Full_Scaled()
        {
            var request = new Image.Common.ImageRequest
                          (
                "",
                new ImageRegion(ImageRegionMode.Full),
                new ImageSize(ImageSizeMode.MaintainAspectRatio, 1, 225, 100),
                new ImageRotation(0, false),
                ImageQuality.@default,
                ImageFormat.jpg
                          );
            var result = ImageRequestInterpreter.GetInterpretedValues(request, width, height, false);

            Assert.AreEqual(0, result.StartX, "Expected x position does not match calculated x position");
            Assert.AreEqual(0, result.StartY, "Expected y position does not match calculated y position");
            Assert.AreEqual(width, result.RegionWidth, "Expected region width does not match calculated region width");
            Assert.AreEqual(height, result.RegionHeight, "Expected region height does not match calculated region height");
            Assert.AreEqual(150, result.OutputWidth, "Expected width does not match calculated width");
            Assert.AreEqual(100, result.OutputHeight, "Expected height does not match calculated height");
        }
        public void Square_Height()
        {
            var request = new Image.Common.ImageRequest
                          (
                "",
                new ImageRegion(ImageRegionMode.Square),
                new ImageSize(ImageSizeMode.MaintainAspectRatio, 1, 0, 100),
                new ImageRotation(0, false),
                ImageQuality.@default,
                ImageFormat.jpg
                          );
            var result = ImageRequestInterpreter.GetInterpretedValues(request, width, height, false);

            Assert.AreEqual(50, result.StartX);
            Assert.AreEqual(0, result.StartY);
            Assert.AreEqual(height, result.RegionWidth);
            Assert.AreEqual(height, result.RegionHeight);
            Assert.AreEqual(100, result.OutputWidth);
            Assert.AreEqual(100, result.OutputHeight);
        }
        public void Square_Width_Height_Distorted()
        {
            var request = new Image.Common.ImageRequest
                          (
                "",
                new ImageRegion(ImageRegionMode.Square),
                new ImageSize(ImageSizeMode.Distort, 1, 150, 50),
                new ImageRotation(0, false),
                ImageQuality.@default,
                ImageFormat.jpg
                          );
            var result = ImageRequestInterpreter.GetInterpretedValues(request, width, height, false);

            Assert.AreEqual(50, result.StartX, "Expected x position does not match calculated x position");
            Assert.AreEqual(0, result.StartY, "Expected y position does not match calculated y position");
            Assert.AreEqual(200, result.RegionWidth, "Expected region width does not match calculated region width");
            Assert.AreEqual(200, result.RegionHeight, "Expected region height does not match calculated region height");
            Assert.AreEqual(150, result.OutputWidth, "Expected width does not match calculated width");
            Assert.AreEqual(50, result.OutputHeight, "Expected height does not match calculated height");
        }
        public void Square_Width()
        {
            var request = new Image.Common.ImageRequest
                          (
                "",
                new ImageRegion(ImageRegionMode.Square),
                new ImageSize(ImageSizeMode.MaintainAspectRatio, 1, 0, 100),
                new ImageRotation(0, false),
                ImageQuality.@default,
                ImageFormat.jpg
                          );
            var result = ImageRequestInterpreter.GetInterpretedValues(request, width, height, false);

            Assert.AreEqual(50, result.StartX, "Expected x offset does not match calculated x offset");
            Assert.AreEqual(0, result.StartY, "Expected y offset does not match calculated y offset");
            Assert.AreEqual(200, result.RegionWidth, "Expected region width does not match calculated region width");
            Assert.AreEqual(200, result.RegionHeight, "Expected region height does not match calculated region height");
            Assert.AreEqual(100, result.OutputWidth, "Expected width does not match calculated width");
            Assert.AreEqual(100, result.OutputHeight, "Expected height does not match calculated width");
        }
        public void Region_And_Size()
        {
            var request = new Image.Common.ImageRequest
                          (
                "",
                new ImageRegion(ImageRegionMode.Region, 600, 900, 100, 100),
                new ImageSize(ImageSizeMode.Distort, 1, 54, 54),
                new ImageRotation(0, false),
                ImageQuality.@default,
                ImageFormat.jpg
                          );
            var result = ImageRequestInterpreter.GetInterpretedValues(request, 1000, 1000, false);

            Assert.AreEqual(600, result.StartX);
            Assert.AreEqual(900, result.StartY);
            Assert.AreEqual(100, result.RegionWidth);
            Assert.AreEqual(100, result.RegionHeight);
            Assert.AreEqual(54, result.OutputWidth);
            Assert.AreEqual(54, result.OutputHeight);
            Assert.AreEqual(0.54f, result.OutputScale);
        }
        public void Full_With_Specific_Size()
        {
            var request = new Image.Common.ImageRequest
                          (
                "",
                new ImageRegion(ImageRegionMode.Full),
                new ImageSize(ImageSizeMode.Distort, 1, 744, 501),
                new ImageRotation(0, false),
                ImageQuality.@default,
                ImageFormat.jpg
                          );
            var result = ImageRequestInterpreter.GetInterpretedValues(request, 1000, 1000, false);

            Assert.AreEqual(0, result.StartX);
            Assert.AreEqual(0, result.StartY);
            Assert.AreEqual(1000, result.RegionWidth);
            Assert.AreEqual(1000, result.RegionHeight);
            Assert.AreEqual(744, result.OutputWidth, "Expected width does not match calculated width");
            Assert.AreEqual(501, result.OutputHeight, "Expected height does not match calculated height");
            //Assert.AreEqual(0.54f, result.OutputScale);
        }
Esempio n. 19
0
        public static (ProcessState state, SKImage image) ExpandRegion(HttpClient client, ILogger Log, Uri imageUri, ImageRequest request, bool allowSizeAboveFull, C.ImageQuality quality)
        {
            using (var compositor = new BitmapCompositor())
                using (var env = new Ckdu_thread_env())
                    using (var family_src = new JPEG2000Source(Log, request.RequestId))
                        using (var wrapped_src = new Cjpx_source())
                            using (var imageDimensions = new Ckdu_dims())
                                using (var limiter = new Ckdu_quality_limiter(quality.WeightedRMSE))
                                {
                                    Ckdu_codestream codestream = new Ckdu_codestream();
                                    try
                                    {
                                        int num_threads = Ckdu_global_funcs.kdu_get_num_processors();
                                        env.create();

                                        for (int nt = 1; nt < num_threads; nt++)
                                        {
                                            if (!env.add_thread())
                                            {
                                                num_threads = nt;
                                            }
                                        }
                                        Log.Debug("Created {@NumThreads} threads", num_threads);
                                        family_src.Open(client, imageUri, false);

                                        int success = wrapped_src.open(family_src, true);
                                        if (success < 1)
                                        {
                                            family_src.close();
                                            wrapped_src.close();
                                            throw new IOException("could not be read as JPEG2000");
                                        }

                                        if (wrapped_src != null)
                                        {
                                            compositor.create(wrapped_src);
                                        }

                                        compositor.set_thread_env(env, null);
                                        compositor.get_total_composition_dims(imageDimensions);
                                        Ckdu_coords imageSize     = imageDimensions.access_size();
                                        Ckdu_coords imagePosition = imageDimensions.access_pos();

                                        float imageScale = 1;

                                        int ref_component = 0;

                                        if (wrapped_src == null)
                                        {
                                            throw new IOException("could not be read as JPEG2000");
                                        }
                                        codestream.create(wrapped_src.access_codestream(ref_component).open_stream());
                                        codestream.set_fast();

                                        int originalWidth, originalHeight;
                                        using (Ckdu_dims original_dims = new Ckdu_dims())
                                        {
                                            codestream.get_dims(ref_component, original_dims);
                                            using (Ckdu_coords original_size = original_dims.access_size())
                                            {
                                                originalWidth  = original_size.x;
                                                originalHeight = original_size.y;
                                            }
                                        }

                                        var kt             = codestream.open_tile(new Ckdu_coords(0, 0), null);
                                        var quality_layers = codestream.get_max_tile_layers();
                                        var layers         = quality.MaxQualityLayers;
                                        if (layers < 0)
                                        {
                                            layers = quality_layers;
                                        }
                                        else if (layers == 0)
                                        {
                                            layers = Convert.ToInt32(Math.Ceiling(quality_layers / 2.0));
                                        }

                                        ushort ppi_x = 96, ppi_y = 96;

                                        if (wrapped_src.access_layer(0).exists())
                                        {
                                            var accessLayer = wrapped_src.access_layer(0);
                                            var resolution  = accessLayer.access_resolution();
                                            if (resolution.exists())
                                            {
                                                bool  for_display     = false;
                                                float ypels_per_metre = resolution.get_resolution(for_display);
                                                if (ypels_per_metre <= 0.0F)
                                                {
                                                    for_display     = true;
                                                    ypels_per_metre = resolution.get_resolution(for_display);
                                                    if (ypels_per_metre <= 0.0F)
                                                    {
                                                        ypels_per_metre = 1.0F;
                                                    }
                                                }

                                                float xpels_per_metre = ypels_per_metre * resolution.get_aspect_ratio(for_display);

                                                ppi_x = Convert.ToUInt16(Math.Ceiling(xpels_per_metre * 0.0254));
                                                ppi_y = Convert.ToUInt16(Math.Ceiling(ypels_per_metre * 0.0254));
                                            }
                                        }

                                        var state = ImageRequestInterpreter.GetInterpretedValues(request, originalWidth, originalHeight, allowSizeAboveFull);
                                        state.HorizontalResolution = ppi_x;
                                        state.VerticalResolution   = ppi_y;
                                        Log.Debug("Image request {@Request}", state);
                                        var scale     = state.OutputScale;
                                        var scaleDiff = 0f;
                                        imageScale = state.ImageScale;

                                        // needs to be able to handle regions
                                        imageSize.x = Convert.ToInt32(Math.Round(state.RegionWidth / scale));
                                        imageSize.y = Convert.ToInt32(Math.Round(state.RegionHeight / scale));

                                        imagePosition.x = state.StartX;
                                        imagePosition.y = state.StartY;

                                        Ckdu_dims extracted_dims = new Ckdu_dims();
                                        extracted_dims.assign(imageDimensions);
                                        extracted_dims.access_size().x = Convert.ToInt32(Math.Round(imageSize.x * imageScale));
                                        extracted_dims.access_size().y = Convert.ToInt32(Math.Round(imageSize.y * imageScale));
                                        var viewSize = extracted_dims.access_size();
                                        Log.Debug("add_ilayer extracted dimension: {@AccessPos}, {@AccessSize}, {@IsEmpty}, {@Scale}", extracted_dims.access_pos(), extracted_dims.access_size(), extracted_dims.is_empty(), scale);
                                        compositor.add_ilayer(0, extracted_dims, extracted_dims);

                                        compositor.set_scale(false, false, false, scale);

                                        compositor.get_total_composition_dims(extracted_dims);
                                        Log.Debug("get_total_composition_dims extracted dimension: {@AccessPos}, {@AccessSize}, {@IsEmpty}, {@Scale}", extracted_dims.access_pos(), extracted_dims.access_size(), extracted_dims.is_empty(), scale);
                                        // check if the access size is the expected size as floating point rounding errors
                                        // might occur
                                        const float roundingValue = 0.0001f;
                                        if (((scale - roundingValue) * imageSize.x > 1 && (scale - roundingValue) * imageSize.y > 1) &&
                                            (scale * imageSize.x != viewSize.x ||
                                             scale * imageSize.y != viewSize.y))
                                        {
                                            // attempt to correct by shifting rounding down
                                            compositor.set_scale(false, false, false, 1, scale - roundingValue);

                                            compositor.get_total_composition_dims(extracted_dims);
                                            extracted_dims.access_size().x = Convert.ToInt32(Math.Round(imageSize.x * imageScale));
                                            extracted_dims.access_size().y = Convert.ToInt32(Math.Round(imageSize.y * imageScale));
                                            viewSize = extracted_dims.access_size();
                                        }

                                        var checkScale = compositor.check_invalid_scale_code();
                                        if (0 != checkScale)
                                        {
                                            // we've come up with a scale factor which is (probably) way too small
                                            // ask Kakadu to come up with a valid one that's close
                                            var minScale = Ckdu_global.KDU_COMPOSITOR_SCALE_TOO_SMALL == checkScale ? scale : 0;
                                            var maxScale = Ckdu_global.KDU_COMPOSITOR_SCALE_TOO_LARGE == checkScale ? scale : 1;

                                            var optimal_scale = compositor.find_optimal_scale(extracted_dims, 0, minScale, maxScale);
                                            scaleDiff = Ckdu_global.KDU_COMPOSITOR_SCALE_TOO_SMALL == checkScale ? optimal_scale - scale : scale - optimal_scale;
                                            scale     = optimal_scale;
                                            compositor.set_scale(false, false, false, scale);
                                            compositor.get_total_composition_dims(extracted_dims);
                                        }
                                        viewSize = extracted_dims.access_size();
                                        Log.Debug("Extracted dimension: {@AccessPos}, {@AccessSize}, {@IsEmpty}, {@Scale}", extracted_dims.access_pos(), extracted_dims.access_size(), extracted_dims.is_empty(), scale);
                                        compositor.set_buffer_surface(extracted_dims);
                                        compositor.set_quality_limiting(limiter, quality.OutputDpi, quality.OutputDpi);
                                        Log.Debug("Set quality limiting: {@Limiter}, {@HorizontalPPI}, {@VerticalPPI}", limiter, quality.OutputDpi, quality.OutputDpi);
                                        compositor.set_max_quality_layers(layers);
                                        Log.Debug("Set max quality layers: {@Layers}", layers);
                                        var compositorBuffer = compositor.GetCompositionBitmap(extracted_dims);

                                        using (Ckdu_dims newRegion = new Ckdu_dims())
                                        {
                                            // we're only interested in the final composited image
                                            while (compositor.process(256000, newRegion))
                                            {
                                            }

                                            using (var bmp = compositorBuffer.AcquireBitmap())
                                            {
                                                return(state, SKImage.FromBitmap(bmp));
                                            }
                                        }
                                    }
                                    finally
                                    {
                                        if (codestream.exists())
                                        {
                                            codestream.destroy();
                                        }

                                        if (env.exists())
                                        {
                                            env.destroy();
                                        }

                                        if (family_src != null)
                                        {
                                            family_src.close();
                                        }
                                        else if (wrapped_src != null)
                                        {
                                            wrapped_src.close();
                                        }
                                    }
                                }
        }
 public void RegionShouldNotAllowUnsigned()
 {
     var request = new Image.Common.ImageRequest("", new ImageRegion(ImageRegionMode.Region, -1, 0, 500, 500), new ImageSize(ImageSizeMode.Max, 1), new ImageRotation(0, false));
     var result  = ImageRequestInterpreter.GetInterpretedValues(request, 2000, 2000, false);
 }