Browse Source

Add Tiff implementation of IImageFormat

pull/1570/head
Andrew Wilkinson 9 years ago
parent
commit
64f791d8d8
  1. 30
      src/ImageSharp.Formats.Tiff/TiffConstants.cs
  2. 41
      src/ImageSharp.Formats.Tiff/TiffFormat.cs
  3. 88
      tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffFormatTests.cs

30
src/ImageSharp.Formats.Tiff/TiffConstants.cs

@ -0,0 +1,30 @@
// <copyright file="TiffConstants.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace ImageSharp.Formats
{
using System.Text;
/// <summary>
/// Defines constants defined in the TIFF specification.
/// </summary>
internal static class GifConstants
{
/// <summary>
/// Byte order markers for indicating little endian encoding.
/// </summary>
public const ushort ByteOrderLittleEndian = 0x4949;
/// <summary>
/// Byte order markers for indicating big endian encoding.
/// </summary>
public const ushort ByteOrderBigEndian = 0x4D4D;
/// <summary>
/// Magic number used within the image file header to identify a TIFF format file.
/// </summary>
public const ushort HeaderMagicNumber = 42;
}
}

41
src/ImageSharp.Formats.Tiff/TiffFormat.cs

@ -0,0 +1,41 @@
// <copyright file="TiffFormat.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace ImageSharp.Formats
{
using System.Collections.Generic;
/// <summary>
/// Encapsulates the means to encode and decode Tiff images.
/// </summary>
public class TiffFormat //: IImageFormat
{
/// <inheritdoc/>
public string MimeType => "image/tiff";
/// <inheritdoc/>
public string Extension => "tif";
/// <inheritdoc/>
public IEnumerable<string> SupportedExtensions => new string[] { "tif", "tiff" };
/// <inheritdoc/>
//public IImageDecoder Decoder => new TiffDecoder();
/// <inheritdoc/>
//public IImageEncoder Encoder => throw new System.NotImplementedException();
/// <inheritdoc/>
public int HeaderSize => 4;
/// <inheritdoc/>
public bool IsSupportedFileFormat(byte[] header)
{
return header.Length >= this.HeaderSize &&
((header[0] == 0x49 && header[1] == 0x49 && header[2] == 0x2A && header[3] == 0x00) || // Little-endian
(header[0] == 0x4D && header[1] == 0x4D && header[2] == 0x00 && header[3] == 0x2A)); // Big-endian
}
}
}

88
tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffFormatTests.cs

@ -0,0 +1,88 @@
// <copyright file="TiffFormatTests.cs" company="James Jackson-South">
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
// </copyright>
namespace ImageSharp.Tests
{
using System.Linq;
using Xunit;
using ImageSharp.Formats;
public class TiffFormatTests
{
public static object[][] IsLittleEndianValues = new[] { new object[] { false },
new object[] { true } };
[Theory]
[MemberData(nameof(IsLittleEndianValues))]
public void IsSupportedFileFormat_ReturnsTrue_ForValidFile(bool isLittleEndian)
{
byte[] bytes = new TiffGenHeader()
{
FirstIfd = new TiffGenIfd()
}
.ToBytes(isLittleEndian);
TiffFormat tiffFormat = new TiffFormat();
byte[] headerBytes = bytes.Take(tiffFormat.HeaderSize).ToArray();
bool isSupported = tiffFormat.IsSupportedFileFormat(headerBytes);
Assert.True(isSupported);
}
[Theory]
[MemberData(nameof(IsLittleEndianValues))]
public void IsSupportedFileFormat_ReturnsFalse_WithInvalidByteOrderMarkers(bool isLittleEndian)
{
byte[] bytes = new TiffGenHeader()
{
FirstIfd = new TiffGenIfd(),
ByteOrderMarker = 0x1234
}
.ToBytes(isLittleEndian);
TiffFormat tiffFormat = new TiffFormat();
byte[] headerBytes = bytes.Take(tiffFormat.HeaderSize).ToArray();
bool isSupported = tiffFormat.IsSupportedFileFormat(headerBytes);
Assert.False(isSupported);
}
[Theory]
[MemberData(nameof(IsLittleEndianValues))]
public void IsSupportedFileFormat_ReturnsFalse_WithIncorrectMagicNumber(bool isLittleEndian)
{
byte[] bytes = new TiffGenHeader()
{
FirstIfd = new TiffGenIfd(),
MagicNumber = 32
}
.ToBytes(isLittleEndian);
TiffFormat tiffFormat = new TiffFormat();
byte[] headerBytes = bytes.Take(tiffFormat.HeaderSize).ToArray();
bool isSupported = tiffFormat.IsSupportedFileFormat(headerBytes);
Assert.False(isSupported);
}
[Theory]
[MemberData(nameof(IsLittleEndianValues))]
public void IsSupportedFileFormat_ReturnsFalse_WithShortHeader(bool isLittleEndian)
{
byte[] bytes = new TiffGenHeader()
{
FirstIfd = new TiffGenIfd()
}
.ToBytes(isLittleEndian);
TiffFormat tiffFormat = new TiffFormat();
byte[] headerBytes = bytes.Take(tiffFormat.HeaderSize - 1).ToArray();
bool isSupported = tiffFormat.IsSupportedFileFormat(headerBytes);
Assert.False(isSupported);
}
}
}
Loading…
Cancel
Save