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); }
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); }