/// <summary> /// 打开一张扫描切片 /// </summary> /// <param name="path"></param> /// <param name="info">输出. 封装了切片信息</param> /// <returns>切片的宽高 (slideW, slideH) </returns> public void Open(string path, object info) { if (!(info is SceneGeometry)) { throw new InvalidOperationException("Info is not MapGeometry type."); } if (OpenSlideImage.DetectFormat(path) == null) { throw new InvalidOperationException($"<<{path}>> is NOT a digital slide!"); } slide = OpenSlideImage.Open(path); SceneGeometry sg = info as SceneGeometry; sg.Init(); sg.SlideW = (int)slide.Width; sg.SlideH = (int)slide.Height; sg.L = 0; sg.X = sg.SlideW / 2; sg.Y = sg.SlideH / 2; sg.NumL = slide.LevelCount; for (int i = 0; i < sg.NumL; ++i) { sg.SetDensityAtLevel(i, slide.GetLevelDownsample(i)); } thumbJpgBuf = slide.GetThumbnailAsJpeg(1024, 90); }
public void TestOpen(string fileName) { using (var osr = OpenSlideImage.Open(fileName)) { Assert.False(osr.SafeHandle.IsInvalid); } }
public void TestOpen(string fileName) { using (var osr = OpenSlideImage.Open(fileName)) { Assert.True(osr.Handle != IntPtr.Zero); } }
public static void Run(FileInfo input, FileInfo output, int tileSize, int overlap) { var dziFile = new FileInfo(output.FullName + ".dzi"); var dziDirectory = new DirectoryInfo(output.FullName + "_files"); if (dziFile.Exists) { Console.WriteLine($"Error: File {dziFile.FullName} already exists."); return; } if (dziDirectory.Exists) { Console.WriteLine($"Error: Directory {dziDirectory} already exists."); return; } if (tileSize <= 0) { Console.WriteLine("Error: Tile size is invalid."); return; } if (overlap < 0) { Console.WriteLine("Error: Overlap is invalid."); return; } dziDirectory.Create(); using var image = OpenSlideImage.Open(input.FullName); var dz = new DeepZoomGenerator(image, tileSize, overlap); Console.WriteLine("Writing: " + dziFile.FullName); File.WriteAllText(dziFile.FullName, dz.GetDzi("jpg")); int currentCount = 0; int totalCount = dz.TileCount; var levelDimensions = dz.LevelDimensions.ToArray(); for (int level = dz.LevelCount - 1; level >= 0; level--) { DirectoryInfo levelDirectory = dziDirectory.CreateSubdirectory(level.ToString(CultureInfo.InvariantCulture)); long width = levelDimensions[level].Width; long height = levelDimensions[level].Height; int colCount = (int)((width + tileSize - 1) / tileSize); int rowCount = (int)((height + tileSize - 1) / tileSize); for (int row = 0; row < rowCount; row++) { for (int col = 0; col < colCount; col++) { string path = Path.Combine(levelDirectory.FullName, $"{col}_{row}.jpg"); Console.WriteLine("Writing: " + path + $" [{++currentCount}/{totalCount}]"); using var fs = new FileStream(path, FileMode.Create, FileAccess.Write); dz.GetTileAsJpegToStream(level, col, row, fs); } } } }
public ImageProvider(IOptions <ImageOption> options) { var path = options.Value.Path; _image = OpenSlideImage.Open(path); _generator = new DeepZoomGenerator(_image, tileSize: 254, overlap: 1); }
public void TestMetadata() { string currentDir = Directory.GetCurrentDirectory(); using (var osr = OpenSlideImage.Open(Path.Combine(currentDir, "Assets", "boxes.tiff"))) { var dz = new DeepZoomGenerator(osr, 254, 1); Assert.Equal(10, dz.LevelCount); Assert.Equal(11, dz.TileCount); Assert.Equal(new(int, int)[] { (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (2, 1) }, dz.LevelTiles);
public void TestUnreadableSlideBadAssociatedImage() { string currentDir = Directory.GetCurrentDirectory(); using (var osr = OpenSlideImage.Open(Path.Combine(currentDir, "Assets", "unreadable.svs"))) { Assert.Equal("aperio", osr.GetProperty("openslide.vendor", string.Empty)); Assert.Throws <OpenSlideException>(() => { osr.ReadAssociatedImage("thumbnail", out var _); }); // openslide object has turned into an unusable state. Assert.False(osr.TryGetProperty("", out string value)); } }
public void TestOperationsOnClosedHandle() { string currentDir = Directory.GetCurrentDirectory(); var osr = OpenSlideImage.Open(Path.Combine(currentDir, "Assets", "boxes.tiff")); Assert.NotEmpty(osr.GetAllPropertyNames()); Assert.Empty(osr.GetAllAssociatedImageNames()); osr.Dispose(); Assert.Throws <ObjectDisposedException>(() => osr.LevelCount); Assert.Throws <ObjectDisposedException>(() => osr.ReadRegion(0, 0, 0, 100, 100)); Assert.Throws <ObjectDisposedException>(() => osr.GetProperty("openslide.vendor", string.Empty)); Assert.Throws <ObjectDisposedException>(() => { osr.ReadAssociatedImage("label", out var _); }); }
public void TestReadRegion() { string currentDir = Directory.GetCurrentDirectory(); using (var osr = OpenSlideImage.Open(Path.Combine(currentDir, "Assets", "boxes.tiff"))) { byte[] arr; arr = osr.ReadRegion(1, -10, -10, 400, 400); Assert.Equal(400 * 400 * 4, arr.Length); arr = osr.ReadRegion(4, 0, 0, 100, 100); // Bad level Assert.Equal(100 * 100 * 4, arr.Length); Assert.Throws <ArgumentOutOfRangeException>(() => { osr.ReadRegion(1, 0, 0, 400, -5); }); } }
public void TestAssociatedImages() { string currentDir = Directory.GetCurrentDirectory(); using (var osr = OpenSlideImage.Open(Path.Combine(currentDir, "Assets", "small.svs"))) { Assert.NotEmpty(osr.GetAllAssociatedImageNames()); byte[] arr; arr = osr.ReadAssociatedImage("thumbnail", out var dims); Assert.Equal(16, dims.Width); Assert.Equal(16, dims.Height); Assert.Equal(16 * 16 * 4, arr.Length); Assert.Throws <KeyNotFoundException>(() => { osr.ReadAssociatedImage("__missing", out var _); }); } }
public void TestProperties() { string currentDir = Directory.GetCurrentDirectory(); using (var osr = OpenSlideImage.Open(Path.Combine(currentDir, "Assets", "boxes.tiff"))) { var props = osr.GetAllPropertyNames(); string value = null; Assert.True(osr.TryGetProperty("openslide.vendor", out value)); Assert.Equal("generic-tiff", value); string value2 = null; Assert.False(osr.TryGetProperty("__does_not_exist", out value2)); Assert.Null(value2); } }
public RetainableDeepZoomGenerator RetainDeepZoomGenerator(string name, string path) { RetainableDeepZoomGenerator dz; if (_cache.TryGet(name, out dz)) { dz.Retain(); return(dz); } dz = new RetainableDeepZoomGenerator(OpenSlideImage.Open(path)); if (_cache.TrySet(name, dz)) { dz.Retain(); return(dz); } dz.Retain(); dz.Dispose(); return(dz); }
public void TestMeradata() { string currentDir = Directory.GetCurrentDirectory(); using (var osr = OpenSlideImage.Open(Path.Combine(currentDir, "Assets", "boxes.tiff"))) { Assert.Equal(4, osr.LevelCount); Assert.Equal <ValueTuple <long, long> >((300, 250), osr.GetLevelDimensions(0)); Assert.Equal <ValueTuple <long, long> >((150, 125), osr.GetLevelDimensions(1)); Assert.Equal <ValueTuple <long, long> >((75, 62), osr.GetLevelDimensions(2)); Assert.Equal <ValueTuple <long, long> >((37, 31), osr.GetLevelDimensions(3)); Assert.Equal(1, osr.GetLevelDownsample(0)); Assert.Equal(2, osr.GetLevelDownsample(1)); Assert.Equal(4, osr.GetLevelDownsample(2), 0); Assert.Equal(8, osr.GetLevelDownsample(3), 0); Assert.Equal(0, osr.GetBestLevelForDownsample(0.5)); Assert.Equal(1, osr.GetBestLevelForDownsample(3)); Assert.Equal(3, osr.GetBestLevelForDownsample(37)); } }
public void TestUnopenableFile() { string currentDir = Directory.GetCurrentDirectory(); Assert.Throws <OpenSlideException>(() => OpenSlideImage.Open(Path.Combine(currentDir, "Assets", "unopenable.tiff"))); }
public void TestDetectFormat(string fileName, string format) { Assert.Equal(format, OpenSlideImage.DetectFormat(fileName)); }
public void TestUnsupportedFiles(string fileName) { Assert.Throws <OpenSlideUnsupportedFormatException>(() => OpenSlideImage.Open(fileName)); }
public RetainableDeepZoomGenerator(OpenSlideImage image, int tileSize = 254, int overlap = 1, bool limitBounds = true) : base(image, tileSize, overlap, limitBounds, true) { }