protected virtual void ExtractMetadata(TagLib.Image.File metadata) { if (metadata != null) { Orientation = metadata.ImageTag.Orientation; } }
public void ValidateMetadataInvariants(TagLib.Image.File file) { Assert.IsNotNull(file); // This file doesn't have an orientation tag, we had a bug that causes // an exception when looking it up. Test it here. Assert.AreEqual(ImageOrientation.None, file.ImageTag.Orientation); // ---------- Start of IFD tests ---------- var tag = file.GetTag(TagTypes.TiffIFD) as IFDTag; Assert.IsNotNull(tag, "IFD tag not found"); var structure = tag.Structure; // Image.0x010F (Make/Ascii/6) "Canon" { var entry = structure.GetEntry(0, (ushort)IFDEntryTag.Make); Assert.IsNotNull(entry, "Entry 0x010F missing in IFD 0"); Assert.IsNotNull(entry as StringIFDEntry, "Entry is not a string!"); Assert.AreEqual("Canon", (entry as StringIFDEntry).Value); } // Image.0x0110 (Model/Ascii/15) "Canon EOS 450D" { var entry = structure.GetEntry(0, (ushort)IFDEntryTag.Model); Assert.IsNotNull(entry, "Entry 0x0110 missing in IFD 0"); Assert.IsNotNull(entry as StringIFDEntry, "Entry is not a string!"); Assert.AreEqual("Canon EOS 450D", (entry as StringIFDEntry).Value); } // Image.0x011A (XResolution/Rational/1) "300/1" { var entry = structure.GetEntry(0, (ushort)IFDEntryTag.XResolution); Assert.IsNotNull(entry, "Entry 0x011A missing in IFD 0"); Assert.IsNotNull(entry as RationalIFDEntry, "Entry is not a rational!"); Assert.AreEqual(300, (entry as RationalIFDEntry).Value.Numerator); Assert.AreEqual(1, (entry as RationalIFDEntry).Value.Denominator); } // Image.0x011B (YResolution/Rational/1) "300/1" { var entry = structure.GetEntry(0, (ushort)IFDEntryTag.YResolution); Assert.IsNotNull(entry, "Entry 0x011B missing in IFD 0"); Assert.IsNotNull(entry as RationalIFDEntry, "Entry is not a rational!"); Assert.AreEqual(300, (entry as RationalIFDEntry).Value.Numerator); Assert.AreEqual(1, (entry as RationalIFDEntry).Value.Denominator); } // Image.0x0128 (ResolutionUnit/Short/1) "2" { var entry = structure.GetEntry(0, (ushort)IFDEntryTag.ResolutionUnit); Assert.IsNotNull(entry, "Entry 0x0128 missing in IFD 0"); Assert.IsNotNull(entry as ShortIFDEntry, "Entry is not a short!"); Assert.AreEqual(2, (entry as ShortIFDEntry).Value); } // Image.0x0132 (DateTime/Ascii/20) "2010:02:08 11:37:33" { var entry = structure.GetEntry(0, (ushort)IFDEntryTag.DateTime); Assert.IsNotNull(entry, "Entry 0x0132 missing in IFD 0"); Assert.IsNotNull(entry as StringIFDEntry, "Entry is not a string!"); Assert.AreEqual("2010:02:08 11:37:33", (entry as StringIFDEntry).Value); } // Image.0x013B (Artist/Ascii/17) "Ruben Vermeersch" { var entry = structure.GetEntry(0, (ushort)IFDEntryTag.Artist); Assert.IsNotNull(entry, "Entry 0x013B missing in IFD 0"); Assert.IsNotNull(entry as StringIFDEntry, "Entry is not a string!"); Assert.AreEqual("Ruben Vermeersch", (entry as StringIFDEntry).Value); } // Image.0x8769 (ExifTag/SubIFD/1) "186" { var entry = structure.GetEntry(0, (ushort)IFDEntryTag.ExifIFD); Assert.IsNotNull(entry, "Entry 0x8769 missing in IFD 0"); Assert.IsNotNull(entry as SubIFDEntry, "Entry is not a sub IFD!"); } var exif = structure.GetEntry(0, (ushort)IFDEntryTag.ExifIFD) as SubIFDEntry; Assert.IsNotNull(exif, "Exif tag not found"); var exif_structure = exif.Structure; // Photo.0x829A (ExposureTime/Rational/1) "1/60" { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.ExposureTime); Assert.IsNotNull(entry, "Entry 0x829A missing in IFD 0"); Assert.IsNotNull(entry as RationalIFDEntry, "Entry is not a rational!"); Assert.AreEqual(1, (entry as RationalIFDEntry).Value.Numerator); Assert.AreEqual(60, (entry as RationalIFDEntry).Value.Denominator); } // Photo.0x829D (FNumber/Rational/1) "32/10" { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.FNumber); Assert.IsNotNull(entry, "Entry 0x829D missing in IFD 0"); Assert.IsNotNull(entry as RationalIFDEntry, "Entry is not a rational!"); Assert.AreEqual(32, (entry as RationalIFDEntry).Value.Numerator); Assert.AreEqual(10, (entry as RationalIFDEntry).Value.Denominator); } // Photo.0x8822 (ExposureProgram/Short/1) "3" { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.ExposureProgram); Assert.IsNotNull(entry, "Entry 0x8822 missing in IFD 0"); Assert.IsNotNull(entry as ShortIFDEntry, "Entry is not a short!"); Assert.AreEqual(3, (entry as ShortIFDEntry).Value); } // Photo.0x8827 (ISOSpeedRatings/Short/1) "1600" { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.ISOSpeedRatings); Assert.IsNotNull(entry, "Entry 0x8827 missing in IFD 0"); Assert.IsNotNull(entry as ShortIFDEntry, "Entry is not a short!"); Assert.AreEqual(1600, (entry as ShortIFDEntry).Value); } // Photo.0x9000 (ExifVersion/Undefined/4) "48 50 50 49 " { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.ExifVersion); Assert.IsNotNull(entry, "Entry 0x9000 missing in IFD 0"); Assert.IsNotNull(entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!"); var bytes = new byte[] { 48, 50, 50, 49 }; var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data; Assert.AreEqual(bytes, parsed_bytes); } // Photo.0x9003 (DateTimeOriginal/Ascii/20) "2010:02:06 10:57:22" { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.DateTimeOriginal); Assert.IsNotNull(entry, "Entry 0x9003 missing in IFD 0"); Assert.IsNotNull(entry as StringIFDEntry, "Entry is not a string!"); Assert.AreEqual("2010:02:06 10:57:22", (entry as StringIFDEntry).Value); } // Photo.0x9004 (DateTimeDigitized/Ascii/20) "2010:02:06 10:57:22" { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.DateTimeDigitized); Assert.IsNotNull(entry, "Entry 0x9004 missing in IFD 0"); Assert.IsNotNull(entry as StringIFDEntry, "Entry is not a string!"); Assert.AreEqual("2010:02:06 10:57:22", (entry as StringIFDEntry).Value); } // Photo.0x9201 (ShutterSpeedValue/SRational/1) "5906891/1000000" { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.ShutterSpeedValue); Assert.IsNotNull(entry, "Entry 0x9201 missing in IFD 0"); Assert.IsNotNull(entry as SRationalIFDEntry, "Entry is not a srational!"); Assert.AreEqual(5906891, (entry as SRationalIFDEntry).Value.Numerator); Assert.AreEqual(1000000, (entry as SRationalIFDEntry).Value.Denominator); } // Photo.0x9202 (ApertureValue/Rational/1) "3356144/1000000" { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.ApertureValue); Assert.IsNotNull(entry, "Entry 0x9202 missing in IFD 0"); Assert.IsNotNull(entry as RationalIFDEntry, "Entry is not a rational!"); Assert.AreEqual(3356144, (entry as RationalIFDEntry).Value.Numerator); Assert.AreEqual(1000000, (entry as RationalIFDEntry).Value.Denominator); } // Photo.0x9204 (ExposureBiasValue/SRational/1) "0/1" { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.ExposureBiasValue); Assert.IsNotNull(entry, "Entry 0x9204 missing in IFD 0"); Assert.IsNotNull(entry as SRationalIFDEntry, "Entry is not a srational!"); Assert.AreEqual(0, (entry as SRationalIFDEntry).Value.Numerator); Assert.AreEqual(1, (entry as SRationalIFDEntry).Value.Denominator); } // Photo.0x9205 (MaxApertureValue/Rational/1) "2/1" { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.MaxApertureValue); Assert.IsNotNull(entry, "Entry 0x9205 missing in IFD 0"); Assert.IsNotNull(entry as RationalIFDEntry, "Entry is not a rational!"); Assert.AreEqual(2, (entry as RationalIFDEntry).Value.Numerator); Assert.AreEqual(1, (entry as RationalIFDEntry).Value.Denominator); } // Photo.0x9207 (MeteringMode/Short/1) "5" { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.MeteringMode); Assert.IsNotNull(entry, "Entry 0x9207 missing in IFD 0"); Assert.IsNotNull(entry as ShortIFDEntry, "Entry is not a short!"); Assert.AreEqual(5, (entry as ShortIFDEntry).Value); } // Photo.0x9209 (Flash/Short/1) "16" { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.Flash); Assert.IsNotNull(entry, "Entry 0x9209 missing in IFD 0"); Assert.IsNotNull(entry as ShortIFDEntry, "Entry is not a short!"); Assert.AreEqual(16, (entry as ShortIFDEntry).Value); } // Photo.0x920A (FocalLength/Rational/1) "35/1" { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.FocalLength); Assert.IsNotNull(entry, "Entry 0x920A missing in IFD 0"); Assert.IsNotNull(entry as RationalIFDEntry, "Entry is not a rational!"); Assert.AreEqual(35, (entry as RationalIFDEntry).Value.Numerator); Assert.AreEqual(1, (entry as RationalIFDEntry).Value.Denominator); } // Photo.0x9291 (SubSecTimeOriginal/Ascii/3) "02" { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.SubsecTimeOriginal); Assert.IsNotNull(entry, "Entry 0x9291 missing in IFD 0"); Assert.IsNotNull(entry as StringIFDEntry, "Entry is not a string!"); Assert.AreEqual("02", (entry as StringIFDEntry).Value); } // Photo.0x9292 (SubSecTimeDigitized/Ascii/3) "02" { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.SubsecTimeDigitized); Assert.IsNotNull(entry, "Entry 0x9292 missing in IFD 0"); Assert.IsNotNull(entry as StringIFDEntry, "Entry is not a string!"); Assert.AreEqual("02", (entry as StringIFDEntry).Value); } // Photo.0xA20E (FocalPlaneXResolution/Rational/1) "4272000/878" { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.FocalPlaneXResolution); Assert.IsNotNull(entry, "Entry 0xA20E missing in IFD 0"); Assert.IsNotNull(entry as RationalIFDEntry, "Entry is not a rational!"); Assert.AreEqual(4272000, (entry as RationalIFDEntry).Value.Numerator); Assert.AreEqual(878, (entry as RationalIFDEntry).Value.Denominator); } // Photo.0xA20F (FocalPlaneYResolution/Rational/1) "2848000/584" { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.FocalPlaneYResolution); Assert.IsNotNull(entry, "Entry 0xA20F missing in IFD 0"); Assert.IsNotNull(entry as RationalIFDEntry, "Entry is not a rational!"); Assert.AreEqual(2848000, (entry as RationalIFDEntry).Value.Numerator); Assert.AreEqual(584, (entry as RationalIFDEntry).Value.Denominator); } // Photo.0xA210 (FocalPlaneResolutionUnit/Short/1) "2" { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.FocalPlaneResolutionUnit); Assert.IsNotNull(entry, "Entry 0xA210 missing in IFD 0"); Assert.IsNotNull(entry as ShortIFDEntry, "Entry is not a short!"); Assert.AreEqual(2, (entry as ShortIFDEntry).Value); } // Photo.0xA401 (CustomRendered/Short/1) "0" { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.CustomRendered); Assert.IsNotNull(entry, "Entry 0xA401 missing in IFD 0"); Assert.IsNotNull(entry as ShortIFDEntry, "Entry is not a short!"); Assert.AreEqual(0, (entry as ShortIFDEntry).Value); } // Photo.0xA402 (ExposureMode/Short/1) "0" { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.ExposureMode); Assert.IsNotNull(entry, "Entry 0xA402 missing in IFD 0"); Assert.IsNotNull(entry as ShortIFDEntry, "Entry is not a short!"); Assert.AreEqual(0, (entry as ShortIFDEntry).Value); } // Photo.0xA403 (WhiteBalance/Short/1) "0" { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.WhiteBalance); Assert.IsNotNull(entry, "Entry 0xA403 missing in IFD 0"); Assert.IsNotNull(entry as ShortIFDEntry, "Entry is not a short!"); Assert.AreEqual(0, (entry as ShortIFDEntry).Value); } // Photo.0xA406 (SceneCaptureType/Short/1) "0" { var entry = exif_structure.GetEntry(0, (ushort)ExifEntryTag.SceneCaptureType); Assert.IsNotNull(entry, "Entry 0xA406 missing in IFD 0"); Assert.IsNotNull(entry as ShortIFDEntry, "Entry is not a short!"); Assert.AreEqual(0, (entry as ShortIFDEntry).Value); } // Thumbnail.0x0103 (Compression/Short/1) "6" { var entry = structure.GetEntry(1, (ushort)IFDEntryTag.Compression); Assert.IsNotNull(entry, "Entry 0x0103 missing in IFD 1"); Assert.IsNotNull(entry as ShortIFDEntry, "Entry is not a short!"); Assert.AreEqual(6, (entry as ShortIFDEntry).Value); } // Thumbnail.0x011A (XResolution/Rational/1) "300/1" { var entry = structure.GetEntry(1, (ushort)IFDEntryTag.XResolution); Assert.IsNotNull(entry, "Entry 0x011A missing in IFD 1"); Assert.IsNotNull(entry as RationalIFDEntry, "Entry is not a rational!"); Assert.AreEqual(300, (entry as RationalIFDEntry).Value.Numerator); Assert.AreEqual(1, (entry as RationalIFDEntry).Value.Denominator); } // Thumbnail.0x011B (YResolution/Rational/1) "300/1" { var entry = structure.GetEntry(1, (ushort)IFDEntryTag.YResolution); Assert.IsNotNull(entry, "Entry 0x011B missing in IFD 1"); Assert.IsNotNull(entry as RationalIFDEntry, "Entry is not a rational!"); Assert.AreEqual(300, (entry as RationalIFDEntry).Value.Numerator); Assert.AreEqual(1, (entry as RationalIFDEntry).Value.Denominator); } // Thumbnail.0x0128 (ResolutionUnit/Short/1) "2" { var entry = structure.GetEntry(1, (ushort)IFDEntryTag.ResolutionUnit); Assert.IsNotNull(entry, "Entry 0x0128 missing in IFD 1"); Assert.IsNotNull(entry as ShortIFDEntry, "Entry is not a short!"); Assert.AreEqual(2, (entry as ShortIFDEntry).Value); } // Thumbnail.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "674" { var entry = structure.GetEntry(1, (ushort)IFDEntryTag.JPEGInterchangeFormat); Assert.IsNotNull(entry, "Entry 0x0201 missing in IFD 1"); Assert.IsNotNull(entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!"); } // Thumbnail.0x0202 (JPEGInterchangeFormatLength/Long/1) "17036" { var entry = structure.GetEntry(1, (ushort)IFDEntryTag.JPEGInterchangeFormatLength); Assert.IsNotNull(entry, "Entry 0x0202 missing in IFD 1"); Assert.IsNotNull(entry as LongIFDEntry, "Entry is not a long!"); Assert.AreEqual(17036, (entry as LongIFDEntry).Value); } // ---------- End of IFD tests ---------- }
public void Init() { file = File.Create(sample_file) as Image.File; }