mirror of https://github.com/SixLabors/ImageSharp
Browse Source
Former-commit-id: 5ea83609c02c71e457f1e083501b30dfb86af88c Former-commit-id: a594b52cfb4b1fb96d39fa1241c1db1db42ee401 Former-commit-id: 7276cfdbaa100a6ba0d705c311e6b439b3d11cfdaf/merge-core
4 changed files with 393 additions and 4 deletions
@ -1 +1 @@ |
|||
25b2ab2a0acfb874ca8ac8ae979fc6b1bc9bf466 |
|||
09f4618eaade2900f7174b9ab400deb0a25bd813 |
|||
@ -0,0 +1,306 @@ |
|||
// <copyright file="ExifProfileTests.cs" company="James Jackson-South">
|
|||
// Copyright (c) James Jackson-South and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
// </copyright>
|
|||
|
|||
namespace ImageProcessorCore.Tests |
|||
{ |
|||
using System; |
|||
using System.Collections; |
|||
using System.IO; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using Xunit; |
|||
|
|||
public class ExifProfileTests |
|||
{ |
|||
[Fact] |
|||
public void Constructor() |
|||
{ |
|||
using (FileStream stream = File.OpenRead(TestImages.Jpg.Calliphora)) |
|||
{ |
|||
Image image = new Image(stream); |
|||
|
|||
Assert.Null(image.ExifProfile); |
|||
|
|||
image.ExifProfile = new ExifProfile(); |
|||
image.ExifProfile.SetValue(ExifTag.Copyright, "Dirk Lemstra"); |
|||
|
|||
image = WriteAndRead(image); |
|||
|
|||
Assert.NotNull(image.ExifProfile); |
|||
Assert.Equal(1, image.ExifProfile.Values.Count()); |
|||
|
|||
ExifValue value = image.ExifProfile.Values.FirstOrDefault(val => val.Tag == ExifTag.Copyright); |
|||
TestValue(value, "Dirk Lemstra"); |
|||
} |
|||
} |
|||
|
|||
[Fact] |
|||
public void ConstructorEmpty() |
|||
{ |
|||
new ExifProfile((byte[])null); |
|||
new ExifProfile(new byte[] { }); |
|||
} |
|||
|
|||
[Fact] |
|||
public void ConstructorCopy() |
|||
{ |
|||
Assert.Throws<ArgumentNullException>(() => { new ExifProfile((ExifProfile)null); }); |
|||
|
|||
ExifProfile profile = GetExifProfile(); |
|||
|
|||
ExifProfile clone = new ExifProfile(profile); |
|||
TestProfile(clone); |
|||
|
|||
profile.SetValue(ExifTag.ColorSpace, (ushort)2); |
|||
|
|||
clone = new ExifProfile(profile); |
|||
TestProfile(clone); |
|||
} |
|||
|
|||
[Fact] |
|||
public void WriteFraction() |
|||
{ |
|||
using (MemoryStream memStream = new MemoryStream()) |
|||
{ |
|||
double exposureTime = 1.0 / 1600; |
|||
|
|||
ExifProfile profile = GetExifProfile(); |
|||
|
|||
profile.SetValue(ExifTag.ExposureTime, exposureTime); |
|||
|
|||
Image image = new Image(1, 1); |
|||
image.ExifProfile = profile; |
|||
|
|||
image.SaveAsJpeg(memStream); |
|||
|
|||
memStream.Position = 0; |
|||
image = new Image(memStream); |
|||
|
|||
profile = image.ExifProfile; |
|||
Assert.NotNull(profile); |
|||
|
|||
ExifValue value = profile.GetValue(ExifTag.ExposureTime); |
|||
Assert.NotNull(value); |
|||
Assert.NotEqual(exposureTime, value.Value); |
|||
|
|||
memStream.Position = 0; |
|||
profile = GetExifProfile(); |
|||
|
|||
profile.SetValue(ExifTag.ExposureTime, exposureTime); |
|||
profile.BestPrecision = true; |
|||
image.ExifProfile = profile; |
|||
|
|||
image.SaveAsJpeg(memStream); |
|||
|
|||
memStream.Position = 0; |
|||
image = new Image(memStream); |
|||
|
|||
profile = image.ExifProfile; |
|||
Assert.NotNull(profile); |
|||
|
|||
value = profile.GetValue(ExifTag.ExposureTime); |
|||
TestValue(value, exposureTime); |
|||
} |
|||
} |
|||
|
|||
[Fact] |
|||
public void ReadWriteInfinity() |
|||
{ |
|||
using (FileStream stream = File.OpenRead(TestImages.Jpg.Floorplan)) |
|||
{ |
|||
Image image = new Image(stream); |
|||
image.ExifProfile.SetValue(ExifTag.ExposureBiasValue, double.PositiveInfinity); |
|||
|
|||
image = WriteAndRead(image); |
|||
ExifValue value = image.ExifProfile.GetValue(ExifTag.ExposureBiasValue); |
|||
Assert.NotNull(value); |
|||
Assert.Equal(double.PositiveInfinity, value.Value); |
|||
|
|||
image.ExifProfile.SetValue(ExifTag.ExposureBiasValue, double.NegativeInfinity); |
|||
|
|||
image = WriteAndRead(image); |
|||
value = image.ExifProfile.GetValue(ExifTag.ExposureBiasValue); |
|||
Assert.NotNull(value); |
|||
Assert.Equal(double.NegativeInfinity, value.Value); |
|||
|
|||
image.ExifProfile.SetValue(ExifTag.FlashEnergy, double.NegativeInfinity); |
|||
|
|||
image = WriteAndRead(image); |
|||
value = image.ExifProfile.GetValue(ExifTag.FlashEnergy); |
|||
Assert.NotNull(value); |
|||
Assert.Equal(double.PositiveInfinity, value.Value); |
|||
} |
|||
} |
|||
|
|||
[Fact] |
|||
public void SetValue() |
|||
{ |
|||
double[] latitude = new double[] { 12.3, 4.56, 789.0 }; |
|||
|
|||
using (FileStream stream = File.OpenRead(TestImages.Jpg.Floorplan)) |
|||
{ |
|||
Image image = new Image(stream); |
|||
image.ExifProfile.SetValue(ExifTag.Software, "ImageProcessorCore"); |
|||
|
|||
ExifValue value = image.ExifProfile.GetValue(ExifTag.Software); |
|||
TestValue(value, "ImageProcessorCore"); |
|||
|
|||
Assert.Throws<ArgumentException>(() => { value.Value = 15; }); |
|||
|
|||
image.ExifProfile.SetValue(ExifTag.ShutterSpeedValue, 75.55); |
|||
|
|||
value = image.ExifProfile.GetValue(ExifTag.ShutterSpeedValue); |
|||
TestValue(value, 75.55); |
|||
|
|||
Assert.Throws<ArgumentException>(() => { value.Value = 75; }); |
|||
|
|||
image.ExifProfile.SetValue(ExifTag.XResolution, 150.0); |
|||
|
|||
value = image.ExifProfile.GetValue(ExifTag.XResolution); |
|||
TestValue(value, 150.0); |
|||
|
|||
Assert.Throws<ArgumentException>(() => { value.Value = "ImageProcessorCore"; }); |
|||
|
|||
image.ExifProfile.SetValue(ExifTag.ReferenceBlackWhite, null); |
|||
|
|||
value = image.ExifProfile.GetValue(ExifTag.ReferenceBlackWhite); |
|||
TestValue(value, (string)null); |
|||
|
|||
image.ExifProfile.SetValue(ExifTag.GPSLatitude, latitude); |
|||
|
|||
value = image.ExifProfile.GetValue(ExifTag.GPSLatitude); |
|||
TestValue(value, latitude); |
|||
|
|||
image = WriteAndRead(image); |
|||
|
|||
Assert.NotNull(image.ExifProfile); |
|||
Assert.Equal(17, image.ExifProfile.Values.Count()); |
|||
|
|||
value = image.ExifProfile.GetValue(ExifTag.Software); |
|||
TestValue(value, "ImageProcessorCore"); |
|||
|
|||
value = image.ExifProfile.GetValue(ExifTag.ShutterSpeedValue); |
|||
TestValue(value, 75.55); |
|||
|
|||
value = image.ExifProfile.GetValue(ExifTag.XResolution); |
|||
TestValue(value, 150.0); |
|||
|
|||
value = image.ExifProfile.GetValue(ExifTag.ReferenceBlackWhite); |
|||
Assert.Null(value); |
|||
|
|||
value = image.ExifProfile.GetValue(ExifTag.GPSLatitude); |
|||
TestValue(value, latitude); |
|||
|
|||
image.ExifProfile.Parts = ExifParts.ExifTags; |
|||
|
|||
image = WriteAndRead(image); |
|||
|
|||
Assert.NotNull(image.ExifProfile); |
|||
Assert.Equal(8, image.ExifProfile.Values.Count()); |
|||
|
|||
Assert.NotNull(image.ExifProfile.GetValue(ExifTag.ColorSpace)); |
|||
Assert.True(image.ExifProfile.RemoveValue(ExifTag.ColorSpace)); |
|||
Assert.False(image.ExifProfile.RemoveValue(ExifTag.ColorSpace)); |
|||
Assert.Null(image.ExifProfile.GetValue(ExifTag.ColorSpace)); |
|||
|
|||
Assert.Equal(7, image.ExifProfile.Values.Count()); |
|||
} |
|||
} |
|||
|
|||
[Fact] |
|||
public void Values() |
|||
{ |
|||
ExifProfile profile = GetExifProfile(); |
|||
|
|||
TestProfile(profile); |
|||
|
|||
var thumbnail = profile.CreateThumbnail<Color, uint>(); |
|||
Assert.NotNull(thumbnail); |
|||
Assert.Equal(256, thumbnail.Width); |
|||
Assert.Equal(170, thumbnail.Height); |
|||
} |
|||
|
|||
[Fact] |
|||
public void WriteTooLargeProfile() |
|||
{ |
|||
StringBuilder junk = new StringBuilder(); |
|||
for (int i = 0; i < 65500; i++) |
|||
junk.Append("I"); |
|||
|
|||
Image image = new Image(100, 100); |
|||
image.ExifProfile = new ExifProfile(); |
|||
image.ExifProfile.SetValue(ExifTag.ImageDescription, junk.ToString()); |
|||
|
|||
using (MemoryStream memStream = new MemoryStream()) |
|||
{ |
|||
Assert.Throws<ImageFormatException>(() => image.SaveAsJpeg(memStream)); |
|||
} |
|||
} |
|||
|
|||
private static ExifProfile GetExifProfile() |
|||
{ |
|||
using (FileStream stream = File.OpenRead(TestImages.Jpg.Floorplan)) |
|||
{ |
|||
Image image = new Image(stream); |
|||
|
|||
ExifProfile profile = image.ExifProfile; |
|||
Assert.NotNull(profile); |
|||
|
|||
return profile; |
|||
} |
|||
} |
|||
|
|||
private static Image WriteAndRead(Image image) |
|||
{ |
|||
using (MemoryStream memStream = new MemoryStream()) |
|||
{ |
|||
image.SaveAsJpeg(memStream); |
|||
|
|||
memStream.Position = 0; |
|||
return new Image(memStream); |
|||
} |
|||
} |
|||
|
|||
private static void TestProfile(ExifProfile profile) |
|||
{ |
|||
Assert.NotNull(profile); |
|||
|
|||
Assert.Equal(16, profile.Values.Count()); |
|||
|
|||
foreach (ExifValue value in profile.Values) |
|||
{ |
|||
Assert.NotNull(value.Value); |
|||
|
|||
if (value.Tag == ExifTag.Software) |
|||
Assert.Equal("Windows Photo Editor 10.0.10011.16384", value.ToString()); |
|||
|
|||
if (value.Tag == ExifTag.XResolution) |
|||
Assert.Equal(300.0, value.Value); |
|||
|
|||
if (value.Tag == ExifTag.PixelXDimension) |
|||
Assert.Equal(2338U, value.Value); |
|||
} |
|||
} |
|||
|
|||
private static void TestValue(ExifValue value, string expected) |
|||
{ |
|||
Assert.NotNull(value); |
|||
Assert.Equal(expected, value.Value); |
|||
} |
|||
|
|||
private static void TestValue(ExifValue value, double expected) |
|||
{ |
|||
Assert.NotNull(value); |
|||
Assert.Equal(expected, value.Value); |
|||
} |
|||
|
|||
private static void TestValue(ExifValue value, double[] expected) |
|||
{ |
|||
Assert.NotNull(value); |
|||
|
|||
Assert.Equal(expected, (ICollection)value.Value); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,50 @@ |
|||
// <copyright file="ExifValueTests.cs" company="James Jackson-South">
|
|||
// Copyright (c) James Jackson-South and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
// </copyright>
|
|||
|
|||
namespace ImageProcessorCore.Tests |
|||
{ |
|||
using System.IO; |
|||
using System.Linq; |
|||
using Xunit; |
|||
|
|||
public class ExifValueTests |
|||
{ |
|||
private static ExifValue GetExifValue() |
|||
{ |
|||
using (FileStream stream = File.OpenRead(TestImages.Jpg.Floorplan)) |
|||
{ |
|||
Image image = new Image(stream); |
|||
|
|||
ExifProfile profile = image.ExifProfile; |
|||
Assert.NotNull(profile); |
|||
|
|||
return profile.Values.First(); |
|||
} |
|||
} |
|||
|
|||
[Fact] |
|||
public void IEquatable() |
|||
{ |
|||
ExifValue first = GetExifValue(); |
|||
ExifValue second = GetExifValue(); |
|||
|
|||
Assert.True(first == second); |
|||
Assert.True(first.Equals(second)); |
|||
Assert.True(first.Equals((object)second)); |
|||
} |
|||
|
|||
[Fact] |
|||
public void Properties() |
|||
{ |
|||
ExifValue value = GetExifValue(); |
|||
|
|||
Assert.Equal(ExifDataType.Ascii, value.DataType); |
|||
Assert.Equal(ExifTag.GPSDOP, value.Tag); |
|||
Assert.Equal(false, value.IsArray); |
|||
Assert.Equal("Windows Photo Editor 10.0.10011.16384", value.ToString()); |
|||
Assert.Equal("Windows Photo Editor 10.0.10011.16384", value.Value); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue