Browse Source

Add tiff decoder option to only decode first frame

pull/2013/head
Brian Popow 4 years ago
parent
commit
204f94e84b
  1. 1
      src/ImageSharp/Formats/Gif/GifDecoder.cs
  2. 7
      src/ImageSharp/Formats/Tiff/ITiffDecoderOptions.cs
  3. 6
      src/ImageSharp/Formats/Tiff/TiffDecoder.cs
  4. 14
      src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs

1
src/ImageSharp/Formats/Gif/GifDecoder.cs

@ -5,7 +5,6 @@ using System.IO;
using System.Threading;
using System.Threading.Tasks;
using SixLabors.ImageSharp.IO;
using SixLabors.ImageSharp.Memory;
using SixLabors.ImageSharp.Metadata;
using SixLabors.ImageSharp.PixelFormats;

7
src/ImageSharp/Formats/Tiff/ITiffDecoderOptions.cs

@ -1,6 +1,8 @@
// Copyright (c) Six Labors.
// Licensed under the Apache License, Version 2.0.
using SixLabors.ImageSharp.Metadata;
namespace SixLabors.ImageSharp.Formats.Tiff
{
/// <summary>
@ -12,5 +14,10 @@ namespace SixLabors.ImageSharp.Formats.Tiff
/// Gets a value indicating whether the metadata should be ignored when the image is being decoded.
/// </summary>
bool IgnoreMetadata { get; }
/// <summary>
/// Gets the decoding mode for multi-frame images.
/// </summary>
FrameDecodingMode DecodingMode { get; }
}
}

6
src/ImageSharp/Formats/Tiff/TiffDecoder.cs

@ -4,6 +4,7 @@
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using SixLabors.ImageSharp.Metadata;
using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.Formats.Tiff
@ -18,6 +19,11 @@ namespace SixLabors.ImageSharp.Formats.Tiff
/// </summary>
public bool IgnoreMetadata { get; set; }
/// <summary>
/// Gets or sets the decoding mode for multi-frame images.
/// </summary>
public FrameDecodingMode DecodingMode { get; set; }
/// <inheritdoc/>
public Image<TPixel> Decode<TPixel>(Configuration configuration, Stream stream)
where TPixel : unmanaged, IPixel<TPixel>

14
src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs

@ -13,7 +13,6 @@ using SixLabors.ImageSharp.IO;
using SixLabors.ImageSharp.Memory;
using SixLabors.ImageSharp.Metadata;
using SixLabors.ImageSharp.Metadata.Profiles.Exif;
using SixLabors.ImageSharp.Metadata.Profiles.Xmp;
using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.Formats.Tiff
@ -33,6 +32,11 @@ namespace SixLabors.ImageSharp.Formats.Tiff
/// </summary>
private readonly bool ignoreMetadata;
/// <summary>
/// Gets the decoding mode for multi-frame images
/// </summary>
private FrameDecodingMode decodingMode;
/// <summary>
/// The stream to decode from.
/// </summary>
@ -59,6 +63,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff
this.Configuration = configuration ?? Configuration.Default;
this.ignoreMetadata = options.IgnoreMetadata;
this.decodingMode = options.DecodingMode;
this.memoryAllocator = this.Configuration.MemoryAllocator;
}
@ -160,11 +165,16 @@ namespace SixLabors.ImageSharp.Formats.Tiff
cancellationToken.ThrowIfCancellationRequested();
ImageFrame<TPixel> frame = this.DecodeFrame<TPixel>(ifd, cancellationToken);
frames.Add(frame);
if (this.decodingMode is FrameDecodingMode.First)
{
break;
}
}
ImageMetadata metadata = TiffDecoderMetadataCreator.Create(frames, this.ignoreMetadata, reader.ByteOrder, reader.IsBigTiff);
// TODO: Tiff frames can have different sizes
// TODO: Tiff frames can have different sizes.
ImageFrame<TPixel> root = frames[0];
this.Dimensions = root.Size();
foreach (ImageFrame<TPixel> frame in frames)

Loading…
Cancel
Save