Exemplo n.º 1
0
        public async Task TestRoundtrip(bool isTile)
        {
            TiffGray8[] refImage  = new TiffGray8[2048 * 2048];
            TiffGray8[] testImage = new TiffGray8[2048 * 2048];

            var rand = new Random(42);

            rand.NextBytes(MemoryMarshal.AsBytes(refImage.AsSpan()));

            var builder = new TiffImageEncoderBuilder();

            builder.PhotometricInterpretation = TiffPhotometricInterpretation.BlackIsZero;
            builder.Compression = TiffCompression.NoCompression;
            builder.IsTiled     = isTile;
            // Make sure we have at least CacheSize strips or tiles
            // Cache size in the current implementation is 256
            // Any value greater than 256 should be OK.
            builder.RowsPerStrip = 2;                    // 1024 strips
            builder.TileSize     = new TiffSize(16, 16); // 16384 tiles

            var ms = new MemoryStream();

            await GenerateImageAsync(ms, builder, TiffPixelBuffer.WrapReadOnly(refImage, 2048, 2048));

            ms.Seek(0, SeekOrigin.Begin);

            await using TiffFileReader tiff = await TiffFileReader.OpenAsync(ms, leaveOpen : true);

            TiffImageDecoder decoder = await tiff.CreateImageDecoderAsync();

            await decoder.DecodeAsync(TiffPixelBuffer.Wrap(testImage, 2048, 2048));

            Assert.True(refImage.AsSpan().SequenceEqual(testImage.AsSpan()));
        }
Exemplo n.º 2
0
        private Task EncodeImageAsync <TPixel>(ImageFrame <TPixel> image, TiffImageFileDirectoryWriter ifdWriter, CancellationToken cancellationToken) where TPixel : unmanaged, IPixel <TPixel>
        {
            ITiffEncoderOptions options = _options;

            var builder = new TiffImageEncoderBuilder();

            builder.MemoryPool = _memoryPool;
            builder.PhotometricInterpretation = options.PhotometricInterpretation;
            builder.Compression              = options.Compression;
            builder.IsTiled                  = options.IsTiled;
            builder.RowsPerStrip             = options.RowsPerStrip;
            builder.TileSize                 = new TiffSize(options.TileSize.Width, options.TileSize.Height);
            builder.Predictor                = options.Predictor;
            builder.EnableTransparencyForRgb = options.EnableTransparencyForRgb;
            builder.Orientation              = options.Orientation;
            builder.DeflateCompressionLevel  = options.DeflateCompressionLevel;
            builder.JpegOptions              = new TiffJpegEncodingOptions {
                Quality = options.JpegQuality, OptimizeCoding = options.JpegOptimizeCoding
            };
            builder.HorizontalChromaSubSampling = options.HorizontalChromaSubSampling;
            builder.VerticalChromaSubSampling   = options.VerticalChromaSubSampling;

            TiffImageEncoder <TPixel> encoder = builder.BuildForImageSharp <TPixel>();

            return(encoder.EncodeAsync(ifdWriter, image, cancellationToken));
        }
Exemplo n.º 3
0
        private static async Task GenerateImageAsync(Stream stream, TiffImageEncoderBuilder builder, TiffPixelBuffer <TiffGray8> image)
        {
            using (TiffFileWriter writer = await TiffFileWriter.OpenAsync(stream, true))
            {
                TiffStreamOffset ifdOffset;
                using (TiffImageFileDirectoryWriter ifdWriter = writer.CreateImageFileDirectory())
                {
                    TiffImageEncoder <TiffGray8> encoder = builder.Build <TiffGray8>();

                    await encoder.EncodeAsync(ifdWriter, image);

                    ifdOffset = await ifdWriter.FlushAsync();
                }

                writer.SetFirstImageFileDirectoryOffset(ifdOffset);
                await writer.FlushAsync();
            }
        }
Exemplo n.º 4
0
        public async Task TestRoundtrip(bool isTile, int maxDegreeOfParallelism, bool isYCbCr)
        {
            TiffGray8[] refImage  = new TiffGray8[4096 * 4096];
            TiffGray8[] testImage = new TiffGray8[4096 * 4096];

            var rand = new Random(42);

            rand.NextBytes(MemoryMarshal.AsBytes(refImage.AsSpan()));

            var builder = new TiffImageEncoderBuilder();

            if (isYCbCr)
            {
                builder.PhotometricInterpretation   = TiffPhotometricInterpretation.YCbCr;
                builder.HorizontalChromaSubSampling = 2;
                builder.VerticalChromaSubSampling   = 2;
            }
            else
            {
                builder.PhotometricInterpretation = TiffPhotometricInterpretation.BlackIsZero;
                builder.Predictor = TiffPredictor.HorizontalDifferencing;
            }

            builder.Compression            = TiffCompression.Lzw;
            builder.IsTiled                = isTile;
            builder.RowsPerStrip           = 64;
            builder.TileSize               = new TiffSize(64, 64);
            builder.MaxDegreeOfParallelism = maxDegreeOfParallelism;

            var ms = new MemoryStream();

            await GenerateImageAsync(ms, builder, TiffPixelBuffer.WrapReadOnly(refImage, 4096, 4096));

            ms.Seek(0, SeekOrigin.Begin);

            await using TiffFileReader tiff = await TiffFileReader.OpenAsync(ms, leaveOpen : true);

            TiffImageDecoder decoder = await tiff.CreateImageDecoderAsync();

            await decoder.DecodeAsync(TiffPixelBuffer.Wrap(testImage, 4096, 4096));

            Assert.True(refImage.AsSpan().SequenceEqual(testImage.AsSpan()));
        }
Exemplo n.º 5
0
        public DeepZoomRipper(DeepZoomRipperOptions options, HttpClientInitializationOptions httpClientInitializationOptions, string outputFile)
        {
            _options = options = options ?? DeepZoomRipperOptions.Default;

            if (httpClientInitializationOptions == HttpClientInitializationOptions.InitializeWithCookieContainer)
            {
                _cookieContainer = new CookieContainer();
                HttpClientHandler handler = new HttpClientHandler
                {
                    CookieContainer = _cookieContainer
                };
                _http = new HttpClient(handler)
                {
                    Timeout = Timeout.InfiniteTimeSpan
                };
            }
            else if (httpClientInitializationOptions == HttpClientInitializationOptions.InitializeWithoutCookieContainer)
            {
                _http = new HttpClient()
                {
                    Timeout = Timeout.InfiniteTimeSpan
                };
            }

            _outputFile = outputFile;

            _configuration = Configuration.Default.Clone();
            _configuration.MaxDegreeOfParallelism = 1;

            var builder = new TiffImageEncoderBuilder();

            builder.PhotometricInterpretation = TiffPhotometricInterpretation.YCbCr;
            builder.IsTiled  = true;
            builder.TileSize = new TiffSize(OutputTileSize, OutputTileSize);
            builder.HorizontalChromaSubSampling = 2;
            builder.VerticalChromaSubSampling   = 2;
            builder.Compression = TiffCompression.Jpeg;
            builder.JpegOptions = new TiffJpegEncodingOptions {
                OptimizeCoding = true
            };

            _encoder = builder.BuildForImageSharp <Rgb24>();
        }
Exemplo n.º 6
0
        public void Setup()
        {
            TiffGray8[] image = new TiffGray8[8192 * 8192];
            _image = TiffPixelBuffer.WrapReadOnly(image, 8192, 8192);

            var builder = new TiffImageEncoderBuilder();

            builder.PhotometricInterpretation = TiffPhotometricInterpretation.WhiteIsZero;
            builder.Compression            = Compression;
            builder.MaxDegreeOfParallelism = DegreeOfParallelism;

            // Strip encoder
            builder.IsTiled      = false;
            builder.RowsPerStrip = 256;
            _stripEncoder        = builder.Build <TiffGray8>();

            // Tile encoder
            builder.IsTiled  = false;
            builder.TileSize = new TiffSize(512, 512);
            _tileEncoder     = builder.Build <TiffGray8>();
        }
Exemplo n.º 7
0
        public async Task Setup()
        {
            TiffGray8[] image = new TiffGray8[8192 * 8192];
            _scratchSpace = TiffPixelBuffer.Wrap(image, 8192, 8192);

            var builder = new TiffImageEncoderBuilder();

            builder.PhotometricInterpretation = TiffPhotometricInterpretation.WhiteIsZero;
            builder.Compression = Compression;

            // Generate a image with many strips
            var ms = new MemoryStream();

            builder.IsTiled      = false;
            builder.RowsPerStrip = 256;
            await GenerateImageAsync(ms, builder, _scratchSpace);

            _stripTestTiff = ms.ToArray();

            ms.SetLength(0);

            // Generate a image with many tiles
            builder.IsTiled  = true;
            builder.TileSize = new TiffSize(512, 512);
            await GenerateImageAsync(ms, builder, _scratchSpace);

            _tileTestTiff = ms.ToArray();

            _stripReader = await TiffFileReader.OpenAsync(_stripTestTiff);

            _stripDecoder = await _stripReader.CreateImageDecoderAsync(new TiffImageDecoderOptions { MaxDegreeOfParallelism = DegreeOfParallelism });

            await _stripDecoder.DecodeAsync(_scratchSpace);

            _tileReader = await TiffFileReader.OpenAsync(_tileTestTiff);

            _tileDecoder = await _tileReader.CreateImageDecoderAsync(new TiffImageDecoderOptions { MaxDegreeOfParallelism = DegreeOfParallelism });

            await _tileDecoder.DecodeAsync(_scratchSpace);
        }
        public async Task Setup()
        {
            TiffGray8[] image = new TiffGray8[8192 * 8192];
            _scratchSpace = TiffPixelBuffer.Wrap(image, 8192, 8192);

            var builder = new TiffImageEncoderBuilder();

            builder.PhotometricInterpretation = TiffPhotometricInterpretation.BlackIsZero;
            builder.Compression = TiffCompression.NoCompression;

            // Generate a image with many strips
            var ms = new MemoryStream();

            builder.IsTiled      = false;
            builder.RowsPerStrip = 1;
            await GenerateImageAsync(ms, builder, _scratchSpace);

            _stripTestTiff = ms.ToArray();

            ms.SetLength(0);

            // Generate a image with many tiles
            builder.IsTiled  = true;
            builder.TileSize = new TiffSize(16, 16); // the minimum tile size
            await GenerateImageAsync(ms, builder, _scratchSpace);

            _tileTestTiff = ms.ToArray();

            _stripReader = await TiffFileReader.OpenAsync(_stripTestTiff);

            _stripDecoder = await _stripReader.CreateImageDecoderAsync();

            await _stripDecoder.DecodeAsync(_scratchSpace);

            _tileReader = await TiffFileReader.OpenAsync(_tileTestTiff);

            _tileDecoder = await _tileReader.CreateImageDecoderAsync();

            await _tileDecoder.DecodeAsync(_scratchSpace);
        }