/// <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);
        }
Example #2
0
 public void TestOpen(string fileName)
 {
     using (var osr = OpenSlideImage.Open(fileName))
     {
         Assert.False(osr.SafeHandle.IsInvalid);
     }
 }
Example #3
0
 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);
                    }
                }
            }
        }
Example #5
0
        public ImageProvider(IOptions <ImageOption> options)
        {
            var path = options.Value.Path;

            _image     = OpenSlideImage.Open(path);
            _generator = new DeepZoomGenerator(_image, tileSize: 254, overlap: 1);
        }
Example #6
0
        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);
Example #7
0
        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));
            }
        }
Example #8
0
        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 _); });
        }
Example #9
0
        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); });
            }
        }
Example #10
0
        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 _); });
            }
        }
Example #11
0
        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);
        }
Example #13
0
        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));
            }
        }
Example #14
0
        public void TestUnopenableFile()
        {
            string currentDir = Directory.GetCurrentDirectory();

            Assert.Throws <OpenSlideException>(() => OpenSlideImage.Open(Path.Combine(currentDir, "Assets", "unopenable.tiff")));
        }
Example #15
0
 public void TestDetectFormat(string fileName, string format)
 {
     Assert.Equal(format, OpenSlideImage.DetectFormat(fileName));
 }
Example #16
0
 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)
 {
 }