Пример #1
0
        /// <summary>
        /// Decodes the image data from a specified IFD.
        /// </summary>
        /// <typeparam name="TPixel">The pixel format.</typeparam>
        /// <param name="tags">The IFD tags.</param>
        /// <param name="cancellationToken">The token to monitor cancellation.</param>
        /// <returns> The tiff frame. </returns>
        private ImageFrame <TPixel> DecodeFrame <TPixel>(ExifProfile tags, CancellationToken cancellationToken)
            where TPixel : unmanaged, IPixel <TPixel>
        {
            ImageFrameMetadata imageFrameMetaData = this.ignoreMetadata ?
                                                    new ImageFrameMetadata() :
                                                    new ImageFrameMetadata {
                ExifProfile = tags, XmpProfile = tags.GetValue(ExifTag.XMP)?.Value
            };

            TiffFrameMetadata tiffFrameMetaData = imageFrameMetaData.GetTiffMetadata();

            TiffFrameMetadata.Parse(tiffFrameMetaData, tags);

            this.VerifyAndParse(tags, tiffFrameMetaData);

            int width  = GetImageWidth(tags);
            int height = GetImageHeight(tags);
            var frame  = new ImageFrame <TPixel>(this.Configuration, width, height, imageFrameMetaData);

            int rowsPerStrip = tags.GetValue(ExifTag.RowsPerStrip) != null ? (int)tags.GetValue(ExifTag.RowsPerStrip).Value : TiffConstants.RowsPerStripInfinity;

            Number[] stripOffsets    = tags.GetValue(ExifTag.StripOffsets)?.Value;
            Number[] stripByteCounts = tags.GetValue(ExifTag.StripByteCounts)?.Value;

            if (this.PlanarConfiguration == TiffPlanarConfiguration.Planar)
            {
                this.DecodeStripsPlanar(frame, rowsPerStrip, stripOffsets, stripByteCounts, cancellationToken);
            }
            else
            {
                this.DecodeStripsChunky(frame, rowsPerStrip, stripOffsets, stripByteCounts, cancellationToken);
            }

            return(frame);
        }
Пример #2
0
        /// <summary>
        /// Decodes the image data from a specified IFD.
        /// </summary>
        /// <typeparam name="TPixel">The pixel format.</typeparam>
        /// <param name="tags">The IFD tags.</param>
        /// <param name="cancellationToken">The token to monitor cancellation.</param>
        /// <returns> The tiff frame. </returns>
        private ImageFrame <TPixel> DecodeFrame <TPixel>(ExifProfile tags, CancellationToken cancellationToken)
            where TPixel : unmanaged, IPixel <TPixel>
        {
            var imageFrameMetaData = new ImageFrameMetadata();

            if (!this.ignoreMetadata)
            {
                imageFrameMetaData.ExifProfile = tags;
            }

            TiffFrameMetadata tiffFrameMetaData = imageFrameMetaData.GetTiffMetadata();

            TiffFrameMetadata.Parse(tiffFrameMetaData, tags);

            this.VerifyAndParse(tags, tiffFrameMetaData);

            int width  = GetImageWidth(tags);
            int height = GetImageHeight(tags);
            var frame  = new ImageFrame <TPixel>(this.Configuration, width, height, imageFrameMetaData);

            int rowsPerStrip = tags.GetValue(ExifTag.RowsPerStrip) != null ? (int)tags.GetValue(ExifTag.RowsPerStrip).Value : TiffConstants.RowsPerStripInfinity;

            var stripOffsetsArray    = (Array)tags.GetValueInternal(ExifTag.StripOffsets).GetValue();
            var stripByteCountsArray = (Array)tags.GetValueInternal(ExifTag.StripByteCounts).GetValue();

            IMemoryOwner <ulong> stripOffsetsMemory    = this.ConvertNumbers(stripOffsetsArray, out Span <ulong> stripOffsets);
            IMemoryOwner <ulong> stripByteCountsMemory = this.ConvertNumbers(stripByteCountsArray, out Span <ulong> stripByteCounts);

            if (this.PlanarConfiguration == TiffPlanarConfiguration.Planar)
            {
                this.DecodeStripsPlanar(
                    frame,
                    rowsPerStrip,
                    stripOffsets,
                    stripByteCounts,
                    cancellationToken);
            }
            else
            {
                this.DecodeStripsChunky(
                    frame,
                    rowsPerStrip,
                    stripOffsets,
                    stripByteCounts,
                    cancellationToken);
            }

            stripOffsetsMemory?.Dispose();
            stripByteCountsMemory?.Dispose();
            return(frame);
        }
Пример #3
0
        /// <inheritdoc/>
        public IImageInfo Identify(BufferedReadStream stream, CancellationToken cancellationToken)
        {
            this.inputStream = stream;
            var reader = new DirectoryReader(stream, this.Configuration.MemoryAllocator);
            IEnumerable <ExifProfile> directories = reader.Read();

            ExifProfile rootFrameExifProfile = directories.First();
            var         rootMetadata         = TiffFrameMetadata.Parse(rootFrameExifProfile);

            ImageMetadata metadata = TiffDecoderMetadataCreator.Create(reader.ByteOrder, reader.IsBigTiff, rootFrameExifProfile);
            int           width    = GetImageWidth(rootFrameExifProfile);
            int           height   = GetImageHeight(rootFrameExifProfile);

            return(new ImageInfo(new PixelTypeInfo((int)rootMetadata.BitsPerPixel), width, height, metadata));
        }