public virtual void TestGimpGreyscaleWithManyChunks() { PngDirectory directory = ProcessFile <PngDirectory>("Tests/Data/gimp-8x12-greyscale-alpha-time-background.png"); Sharpen.Tests.AreEqual(8, directory.GetInt(PngDirectory.TagImageWidth)); Sharpen.Tests.AreEqual(12, directory.GetInt(PngDirectory.TagImageHeight)); Sharpen.Tests.AreEqual(8, directory.GetInt(PngDirectory.TagBitsPerSample)); Sharpen.Tests.AreEqual(4, directory.GetInt(PngDirectory.TagColorType)); Sharpen.Tests.AreEqual(0, directory.GetInt(PngDirectory.TagCompressionType)); Sharpen.Tests.AreEqual(0, directory.GetInt(PngDirectory.TagFilterMethod)); Sharpen.Tests.AreEqual(0, directory.GetInt(PngDirectory.TagInterlaceMethod)); Sharpen.Tests.AreEqual(0.45455, directory.GetDouble(PngDirectory.TagGamma), 0.00001); NUnit.Framework.CollectionAssert.AreEqual(new sbyte[] { 0, 52 }, directory.GetByteArray(PngDirectory.TagBackgroundColor)); //noinspection ConstantConditions //Sharpen.Tests.AreEqual("Tue Jan 01 04:08:30 GMT 2013", directory.GetDate(PngDirectory.TagLastModificationTime).ToString()); // HACK: test modification which solves problem with ToString conversion TimeZoneInfo gmt = Sharpen.Extensions.GetTimeZone("GMT"); Calendar calendar = Calendar.GetInstance(gmt); calendar.Set(2013, 00, 01, 04, 08, 30); Sharpen.Tests.AreEqual(calendar.GetTime(), directory.GetDate(PngDirectory.TagLastModificationTime)); IList <KeyValuePair> pairs = (IList <KeyValuePair>)directory.GetObject(PngDirectory.TagTextualData); NUnit.Framework.Assert.IsNotNull(pairs); Sharpen.Tests.AreEqual(1, pairs.Count); Sharpen.Tests.AreEqual("Comment", pairs[0].GetKey()); Sharpen.Tests.AreEqual("Created with GIMP", pairs[0].GetValue()); }
public void GetTextualDataDescription() { var latin1Encoding = Encoding.GetEncoding("iso-8859-1"); // Latin-1 var textPairs = new List <KeyValuePair>(); StringValue value = new StringValue(latin1Encoding.GetBytes("value"), latin1Encoding); textPairs.Add(new KeyValuePair("keyword", value)); PngDirectory directory = new PngDirectory(PngChunkType.tEXt); PngDescriptor descriptor = new PngDescriptor(directory); directory.Set(PngDirectory.TagTextualData, textPairs); Assert.Equal("keyword: value", descriptor.GetTextualDataDescription()); Assert.Equal("keyword: value", directory.GetDescription(PngDirectory.TagTextualData)); directory = new PngDirectory(PngChunkType.zTXt); descriptor = new PngDescriptor(directory); directory.Set(PngDirectory.TagTextualData, textPairs); Assert.Equal("keyword: value", descriptor.GetTextualDataDescription()); Assert.Equal("keyword: value", directory.GetDescription(PngDirectory.TagTextualData)); directory = new PngDirectory(PngChunkType.iTXt); descriptor = new PngDescriptor(directory); directory.Set(PngDirectory.TagTextualData, textPairs); Assert.Equal("keyword: value", descriptor.GetTextualDataDescription()); Assert.Equal("keyword: value", directory.GetDescription(PngDirectory.TagTextualData)); }
public void GetColorTypeDescription() { PngDirectory directory = new PngDirectory(PngChunkType.IHDR); PngDescriptor descriptor = new PngDescriptor(directory); directory.Set(PngDirectory.TagColorType, 6); Assert.Equal("True Color with Alpha", descriptor.GetColorTypeDescription()); Assert.Equal("True Color with Alpha", directory.GetDescription(PngDirectory.TagColorType)); }
public void GetFilterMethodDescription() { PngDirectory directory = new PngDirectory(PngChunkType.IHDR); PngDescriptor descriptor = new PngDescriptor(directory); directory.Set(PngDirectory.TagFilterMethod, 0); Assert.Equal("Adaptive", descriptor.GetFilterMethodDescription()); Assert.Equal("Adaptive", directory.GetDescription(PngDirectory.TagFilterMethod)); }
public void GetInterlaceMethodDescription() { PngDirectory directory = new PngDirectory(PngChunkType.IHDR); PngDescriptor descriptor = new PngDescriptor(directory); directory.Set(PngDirectory.TagInterlaceMethod, 1); Assert.Equal("Adam7 Interlace", descriptor.GetInterlaceMethodDescription()); Assert.Equal("Adam7 Interlace", directory.GetDescription(PngDirectory.TagInterlaceMethod)); }
public void GetPaletteHasTransparencyDescription() { PngDirectory directory = new PngDirectory(PngChunkType.tRNS); PngDescriptor descriptor = new PngDescriptor(directory); directory.Set(PngDirectory.TagPaletteHasTransparency, 1); Assert.Equal("Yes", descriptor.GetPaletteHasTransparencyDescription()); Assert.Equal("Yes", directory.GetDescription(PngDirectory.TagPaletteHasTransparency)); }
public void GetIsSrgbColorSpaceDescription() { PngDirectory directory = new PngDirectory(PngChunkType.sRGB); PngDescriptor descriptor = new PngDescriptor(directory); directory.Set(PngDirectory.TagSrgbRenderingIntent, 0); Assert.Equal("Perceptual", descriptor.GetIsSrgbColorSpaceDescription()); Assert.Equal("Perceptual", directory.GetDescription(PngDirectory.TagSrgbRenderingIntent)); }
public void GetUnitSpecifierDescription() { PngDirectory directory = new PngDirectory(PngChunkType.pHYs); PngDescriptor descriptor = new PngDescriptor(directory); directory.Set(PngDirectory.TagUnitSpecifier, 1); Assert.Equal("Metres", descriptor.GetUnitSpecifierDescription()); Assert.Equal("Metres", directory.GetDescription(PngDirectory.TagUnitSpecifier)); }
public void GetCompressionTypeDescription() { PngDirectory directory = new PngDirectory(PngChunkType.IHDR); PngDescriptor descriptor = new PngDescriptor(directory); directory.Set(PngDirectory.TagCompressionType, 0); Assert.Equal("Deflate", descriptor.GetCompressionTypeDescription()); Assert.Equal("Deflate", directory.GetDescription(PngDirectory.TagCompressionType)); }
public void ParsePngDirectory_NullDirectory_NoMetadata() { PngDirectory pngDirectory = null; var photo = new Photo(""); pngDirectory.Parse(photo); Assert.Equal(0, photo.Height); Assert.Equal(0, photo.Width); }
public void GetBackgroundColorDescription() { PngDirectory directory = new PngDirectory(PngChunkType.bKGD); PngDescriptor descriptor = new PngDescriptor(directory); directory.Set(PngDirectory.TagBackgroundColor, new byte[] { 52 }); Assert.Equal("Palette Index 52", descriptor.GetBackgroundColorDescription()); Assert.Equal("Palette Index 52", directory.GetDescription(PngDirectory.TagBackgroundColor)); directory.Set(PngDirectory.TagBackgroundColor, new byte[] { 0, 52 }); Assert.Equal("Greyscale Level 52", descriptor.GetBackgroundColorDescription()); Assert.Equal("Greyscale Level 52", directory.GetDescription(PngDirectory.TagBackgroundColor)); directory.Set(PngDirectory.TagBackgroundColor, new byte[] { 0, 50, 0, 51, 0, 52 }); Assert.Equal("R 50, G 51, B 52", descriptor.GetBackgroundColorDescription()); Assert.Equal("R 50, G 51, B 52", directory.GetDescription(PngDirectory.TagBackgroundColor)); }
/// <summary>Parses <see cref="PngDirectory" /> metadata and saves it to the <see cref="Photo" />.</summary> /// <param name="directory">Directory containing the PNG image height and width.</param> /// <param name="photo">Photo object used for storing metadata.</param> public static void Parse(this PngDirectory directory, Photo photo) { if (directory is null || photo is null) { return; } if (directory.TryGetInt32(PngDirectory.TagImageHeight, out var height)) { photo.Height = height; } if (directory.TryGetInt32(PngDirectory.TagImageWidth, out var width)) { photo.Width = width; } }
public virtual void TestGimpGreyscaleWithManyChunks() { TimeZoneInfo timeZone = System.TimeZoneInfo.Local; try { Com.Drew.Metadata.Metadata metadata = ProcessFile("Tests/Data/gimp-8x12-greyscale-alpha-time-background.png"); ICollection <PngDirectory> directories = metadata.GetDirectoriesOfType <PngDirectory>(); NUnit.Framework.Assert.IsNotNull(directories); Sharpen.Tests.AreEqual(6, directories.Count); PngDirectory[] dirs = new PngDirectory[directories.Count]; Sharpen.Collections.ToArray(directories, dirs); Sharpen.Tests.AreEqual(PngChunkType.Ihdr, dirs[0].GetPngChunkType()); Sharpen.Tests.AreEqual(8, dirs[0].GetInt(PngDirectory.TagImageWidth)); Sharpen.Tests.AreEqual(12, dirs[0].GetInt(PngDirectory.TagImageHeight)); Sharpen.Tests.AreEqual(8, dirs[0].GetInt(PngDirectory.TagBitsPerSample)); Sharpen.Tests.AreEqual(4, dirs[0].GetInt(PngDirectory.TagColorType)); Sharpen.Tests.AreEqual(0, dirs[0].GetInt(PngDirectory.TagCompressionType)); Sharpen.Tests.AreEqual(0, dirs[0].GetInt(PngDirectory.TagFilterMethod)); Sharpen.Tests.AreEqual(0, dirs[0].GetInt(PngDirectory.TagInterlaceMethod)); Sharpen.Tests.AreEqual(PngChunkType.gAMA, dirs[1].GetPngChunkType()); Sharpen.Tests.AreEqual(0.45455, dirs[1].GetDouble(PngDirectory.TagGamma), 0.00001); Sharpen.Tests.AreEqual(PngChunkType.bKGD, dirs[2].GetPngChunkType()); NUnit.Framework.CollectionAssert.AreEqual(new sbyte[] { 0, 52 }, dirs[2].GetByteArray(PngDirectory.TagBackgroundColor)); //noinspection ConstantConditions Sharpen.Tests.AreEqual(PngChunkType.pHYs, dirs[3].GetPngChunkType()); Sharpen.Tests.AreEqual(1, dirs[3].GetInt(PngDirectory.TagUnitSpecifier)); Sharpen.Tests.AreEqual(2835, dirs[3].GetInt(PngDirectory.TagPixelsPerUnitX)); Sharpen.Tests.AreEqual(2835, dirs[3].GetInt(PngDirectory.TagPixelsPerUnitY)); Sharpen.Tests.AreEqual(PngChunkType.tIME, dirs[4].GetPngChunkType()); //Sharpen.Tests.AreEqual("Tue Jan 01 04:08:30 GMT 2013", Sharpen.Extensions.ConvertToString(dirs[4].GetDate(PngDirectory.TagLastModificationTime))); var testString = CreateTestString(2013, 00, 01, 04, 08, 30); Sharpen.Tests.AreEqual(testString, Sharpen.Extensions.ConvertToString(dirs[4].GetDate(PngDirectory.TagLastModificationTime))); Sharpen.Tests.AreEqual(PngChunkType.iTXt, dirs[5].GetPngChunkType()); IList <KeyValuePair> pairs = (IList <KeyValuePair>)dirs[5].GetObject(PngDirectory.TagTextualData); NUnit.Framework.Assert.IsNotNull(pairs); Sharpen.Tests.AreEqual(1, pairs.Count); Sharpen.Tests.AreEqual("Comment", pairs[0].GetKey()); Sharpen.Tests.AreEqual("Created with GIMP", pairs[0].GetValue()); } finally { } }
public void ParsePngDirectory_ValidDirectory_AllMetadata() { var pngDirectory = new PngDirectory(PngChunkType.bKGD); var photo = new Photo(""); var height = 32; var width = 32; pngDirectory.Set(PngDirectory.TagImageHeight, height); pngDirectory.Set(PngDirectory.TagImageWidth, width); pngDirectory.Parse(photo); var actualHeight = photo.Height; var actualWidth = photo.Width; Assert.Equal(height, actualHeight); Assert.Equal(width, actualWidth); }
public static Metadata ParsePngDirectory(PngDirectory directory, Metadata metadata) { if (directory.TryGetInt32(PngDirectory.TagImageWidth, out var width)) { metadata.Image.Width = width; } if (directory.TryGetInt32(PngDirectory.TagImageHeight, out var height)) { metadata.Image.Height = height; } if (directory.TryGetInt32(PngDirectory.TagColorType, out var colorTypeId)) { var colorType = PngColorType.FromNumericValue(colorTypeId); metadata.Image.PngColorType = colorType.Description; int?numberOfComponents = null; if (colorType == PngColorType.Greyscale) { numberOfComponents = 1; } else if (colorType == PngColorType.TrueColor) { numberOfComponents = 3; } else if (colorType == PngColorType.GreyscaleWithAlpha) { numberOfComponents = 2; } else if (colorType == PngColorType.TrueColorWithAlpha) { numberOfComponents = 4; } int?dataPrecision = null; if (directory.TryGetInt32(PngDirectory.TagBitsPerSample, out var bitsPerSample)) { dataPrecision = bitsPerSample; } if (dataPrecision != null) { if (numberOfComponents != null) { metadata.Image.BitDepth = (int)(numberOfComponents * dataPrecision); } else { metadata.Image.DataPrecision = (int)dataPrecision; } } } if (directory.TryGetDouble(PngDirectory.TagGamma, out var gamma)) { metadata.Image.Gamma = gamma; } if (directory.ContainsTag(PngDirectory.TagCompressionType)) { metadata.Image.CompressionType = directory.GetDescription(PngDirectory.TagCompressionType); } if (directory.ContainsTag(PngDirectory.TagInterlaceMethod)) { metadata.Image.InterlaceMethod = directory.GetDescription(PngDirectory.TagInterlaceMethod); } return(metadata); }
/// <exception cref="Com.Drew.Imaging.Png.PngProcessingException"/> /// <exception cref="System.IO.IOException"/> private static void ProcessChunk([NotNull] Com.Drew.Metadata.Metadata metadata, [NotNull] PngChunk chunk) { PngChunkType chunkType = chunk.GetChunkType(); sbyte[] bytes = chunk.GetBytes(); if (chunkType.Equals(PngChunkType.Ihdr)) { PngHeader header = new PngHeader(bytes); PngDirectory directory = new PngDirectory(PngChunkType.Ihdr); directory.SetInt(PngDirectory.TagImageWidth, header.GetImageWidth()); directory.SetInt(PngDirectory.TagImageHeight, header.GetImageHeight()); directory.SetInt(PngDirectory.TagBitsPerSample, header.GetBitsPerSample()); directory.SetInt(PngDirectory.TagColorType, header.GetColorType().GetNumericValue()); directory.SetInt(PngDirectory.TagCompressionType, header.GetCompressionType()); directory.SetInt(PngDirectory.TagFilterMethod, header.GetFilterMethod()); directory.SetInt(PngDirectory.TagInterlaceMethod, header.GetInterlaceMethod()); metadata.AddDirectory(directory); } else { if (chunkType.Equals(PngChunkType.Plte)) { PngDirectory directory = new PngDirectory(PngChunkType.Plte); directory.SetInt(PngDirectory.TagPaletteSize, bytes.Length / 3); metadata.AddDirectory(directory); } else { if (chunkType.Equals(PngChunkType.tRNS)) { PngDirectory directory = new PngDirectory(PngChunkType.tRNS); directory.SetInt(PngDirectory.TagPaletteHasTransparency, 1); metadata.AddDirectory(directory); } else { if (chunkType.Equals(PngChunkType.sRGB)) { int srgbRenderingIntent = new SequentialByteArrayReader(bytes).GetInt8(); PngDirectory directory = new PngDirectory(PngChunkType.sRGB); directory.SetInt(PngDirectory.TagSrgbRenderingIntent, srgbRenderingIntent); metadata.AddDirectory(directory); } else { if (chunkType.Equals(PngChunkType.cHRM)) { PngChromaticities chromaticities = new PngChromaticities(bytes); PngChromaticitiesDirectory directory = new PngChromaticitiesDirectory(); directory.SetInt(PngChromaticitiesDirectory.TagWhitePointX, chromaticities.GetWhitePointX()); directory.SetInt(PngChromaticitiesDirectory.TagWhitePointX, chromaticities.GetWhitePointX()); directory.SetInt(PngChromaticitiesDirectory.TagRedX, chromaticities.GetRedX()); directory.SetInt(PngChromaticitiesDirectory.TagRedY, chromaticities.GetRedY()); directory.SetInt(PngChromaticitiesDirectory.TagGreenX, chromaticities.GetGreenX()); directory.SetInt(PngChromaticitiesDirectory.TagGreenY, chromaticities.GetGreenY()); directory.SetInt(PngChromaticitiesDirectory.TagBlueX, chromaticities.GetBlueX()); directory.SetInt(PngChromaticitiesDirectory.TagBlueY, chromaticities.GetBlueY()); metadata.AddDirectory(directory); } else { if (chunkType.Equals(PngChunkType.gAMA)) { int gammaInt = new SequentialByteArrayReader(bytes).GetInt32(); PngDirectory directory = new PngDirectory(PngChunkType.gAMA); directory.SetDouble(PngDirectory.TagGamma, gammaInt / 100000.0); metadata.AddDirectory(directory); } else { if (chunkType.Equals(PngChunkType.iCCP)) { SequentialReader reader = new SequentialByteArrayReader(bytes); string profileName = reader.GetNullTerminatedString(79); PngDirectory directory = new PngDirectory(PngChunkType.iCCP); directory.SetString(PngDirectory.TagIccProfileName, profileName); sbyte compressionMethod = reader.GetInt8(); if (compressionMethod == 0) { // Only compression method allowed by the spec is zero: deflate // This assumes 1-byte-per-char, which it is by spec. int bytesLeft = bytes.Length - profileName.Length - 2; sbyte[] compressedProfile = reader.GetBytes(bytesLeft); InflaterInputStream inflateStream = new InflaterInputStream(new ByteArrayInputStream(compressedProfile)); new IccReader().Extract(new RandomAccessStreamReader(inflateStream), metadata); inflateStream.Close(); } metadata.AddDirectory(directory); } else { if (chunkType.Equals(PngChunkType.bKGD)) { PngDirectory directory = new PngDirectory(PngChunkType.bKGD); directory.SetByteArray(PngDirectory.TagBackgroundColor, bytes); metadata.AddDirectory(directory); } else { if (chunkType.Equals(PngChunkType.tEXt)) { SequentialReader reader = new SequentialByteArrayReader(bytes); string keyword = reader.GetNullTerminatedString(79); int bytesLeft = bytes.Length - keyword.Length - 1; string value = reader.GetNullTerminatedString(bytesLeft); IList <KeyValuePair> textPairs = new AList <KeyValuePair>(); textPairs.Add(new KeyValuePair(keyword, value)); PngDirectory directory = new PngDirectory(PngChunkType.iTXt); directory.SetObject(PngDirectory.TagTextualData, textPairs); metadata.AddDirectory(directory); } else { if (chunkType.Equals(PngChunkType.iTXt)) { SequentialReader reader = new SequentialByteArrayReader(bytes); string keyword = reader.GetNullTerminatedString(79); sbyte compressionFlag = reader.GetInt8(); sbyte compressionMethod = reader.GetInt8(); string languageTag = reader.GetNullTerminatedString(bytes.Length); string translatedKeyword = reader.GetNullTerminatedString(bytes.Length); int bytesLeft = bytes.Length - keyword.Length - 1 - 1 - 1 - languageTag.Length - 1 - translatedKeyword.Length - 1; string text = null; if (compressionFlag == 0) { text = reader.GetNullTerminatedString(bytesLeft); } else { if (compressionFlag == 1) { if (compressionMethod == 0) { text = StringUtil.FromStream(new InflaterInputStream(new ByteArrayInputStream(bytes, bytes.Length - bytesLeft, bytesLeft))); } else { PngDirectory directory = new PngDirectory(PngChunkType.iTXt); directory.AddError("Invalid compression method value"); metadata.AddDirectory(directory); } } else { PngDirectory directory = new PngDirectory(PngChunkType.iTXt); directory.AddError("Invalid compression flag value"); metadata.AddDirectory(directory); } } if (text != null) { if (keyword.Equals("XML:com.adobe.xmp")) { // NOTE in testing images, the XMP has parsed successfully, but we are not extracting tags from it as necessary new XmpReader().Extract(text, metadata); } else { IList <KeyValuePair> textPairs = new AList <KeyValuePair>(); textPairs.Add(new KeyValuePair(keyword, text)); PngDirectory directory = new PngDirectory(PngChunkType.iTXt); directory.SetObject(PngDirectory.TagTextualData, textPairs); metadata.AddDirectory(directory); } } } else { if (chunkType.Equals(PngChunkType.tIME)) { SequentialByteArrayReader reader = new SequentialByteArrayReader(bytes); int year = reader.GetUInt16(); int month = reader.GetUInt8() - 1; int day = reader.GetUInt8(); int hour = reader.GetUInt8(); int minute = reader.GetUInt8(); int second = reader.GetUInt8(); Sharpen.Calendar calendar = Sharpen.Calendar.GetInstance(Sharpen.Extensions.GetTimeZone("UTC")); //noinspection MagicConstant calendar.Set(year, month, day, hour, minute, second); PngDirectory directory = new PngDirectory(PngChunkType.tIME); directory.SetDate(PngDirectory.TagLastModificationTime, calendar.GetTime()); metadata.AddDirectory(directory); } else { if (chunkType.Equals(PngChunkType.pHYs)) { SequentialByteArrayReader reader = new SequentialByteArrayReader(bytes); int pixelsPerUnitX = reader.GetInt32(); int pixelsPerUnitY = reader.GetInt32(); sbyte unitSpecifier = reader.GetInt8(); PngDirectory directory = new PngDirectory(PngChunkType.pHYs); directory.SetInt(PngDirectory.TagPixelsPerUnitX, pixelsPerUnitX); directory.SetInt(PngDirectory.TagPixelsPerUnitY, pixelsPerUnitY); directory.SetInt(PngDirectory.TagUnitSpecifier, unitSpecifier); metadata.AddDirectory(directory); } else { if (chunkType.Equals(PngChunkType.sBIT)) { PngDirectory directory = new PngDirectory(PngChunkType.sBIT); directory.SetByteArray(PngDirectory.TagSignificantBits, bytes); metadata.AddDirectory(directory); } } } } } } } } } } } } } }
public void AnalyzeFile(string filename) { DateTime?originalDateTime = null; int imageHeight = 0; int imageWidth = 0; string extension = System.IO.Path.GetExtension(filename).ToLower(); IEnumerable <MetadataExtractor.Directory> imageDirectories = null; try { imageDirectories = ImageMetadataReader.ReadMetadata(filename); FileMetadataDirectory fileDirectory = imageDirectories.OfType <FileMetadataDirectory>().FirstOrDefault(); FileTypeDirectory fileTypeDirectory = imageDirectories.OfType <FileTypeDirectory>().FirstOrDefault(); //var fileSize = fileDirectory?.GetDescription(FileMetadataDirectory.TagFileSize); long fileSize = fileDirectory?.GetInt64(FileMetadataDirectory.TagFileSize) ?? 0; var modDate = fileDirectory?.GetDateTime(FileMetadataDirectory.TagFileModifiedDate); switch (extension) { case ".jpg": case ".jpeg": { JpegDirectory jpegDirectory = imageDirectories.OfType <JpegDirectory>().FirstOrDefault(); ExifSubIfdDirectory exifSubIfdDirectory = imageDirectories.OfType <ExifSubIfdDirectory>().FirstOrDefault(d => d.ContainsTag(ExifDirectoryBase.TagDateTimeOriginal)); originalDateTime = exifSubIfdDirectory?.GetDateTime(ExifDirectoryBase.TagDateTimeOriginal); if (jpegDirectory != null) { jpegDirectory.TryGetInt32(JpegDirectory.TagImageHeight, out imageHeight); jpegDirectory.TryGetInt32(JpegDirectory.TagImageWidth, out imageWidth); } ImageFileInfo ifi = new ImageFileInfo() { FileFullPath = filename, ImageHeight = imageHeight, ImageSize = fileSize, ImageWidth = imageWidth, ImageModDateTime = modDate, ImageOriginalDateTime = originalDateTime, }; ifi.SetFileSystemInfo(); ImageFiles.AddImageFileInfoToDictionary(ifi); ifi.InsertImageFileInfo(DBOConn); } break; case ".png": { PngDirectory pngDirectory = imageDirectories.OfType <PngDirectory>().FirstOrDefault(d => d.Name == "PNG-IHDR"); if (pngDirectory != null) { pngDirectory.TryGetInt32(PngDirectory.TagImageHeight, out imageHeight); pngDirectory.TryGetInt32(PngDirectory.TagImageWidth, out imageWidth); } ImageFileInfo ifi = new ImageFileInfo() { FileFullPath = filename, ImageHeight = imageHeight, ImageSize = fileSize, ImageWidth = imageWidth, ImageModDateTime = modDate, ImageOriginalDateTime = originalDateTime, }; ifi.SetFileSystemInfo(); ImageFiles.AddImageFileInfoToDictionary(ifi); ifi.InsertImageFileInfo(DBOConn); } break; case ".nef": { List <ExifSubIfdDirectory> exifSubIfdDirectories = imageDirectories.OfType <ExifSubIfdDirectory>().ToList(); ExifSubIfdDirectory exifSubIfdDirectory = imageDirectories.OfType <ExifSubIfdDirectory>().FirstOrDefault(d => d.GetDescription(ExifDirectoryBase.TagNewSubfileType) == "Full-resolution image"); if (exifSubIfdDirectory != null) { exifSubIfdDirectory.TryGetInt32(ExifDirectoryBase.TagImageHeight, out imageHeight); exifSubIfdDirectory.TryGetInt32(ExifDirectoryBase.TagImageWidth, out imageWidth); } exifSubIfdDirectory = imageDirectories.OfType <ExifSubIfdDirectory>().FirstOrDefault(d => d.ContainsTag(ExifDirectoryBase.TagDateTimeOriginal)); originalDateTime = exifSubIfdDirectory?.GetDateTime(ExifDirectoryBase.TagDateTimeOriginal); ImageFileInfo ifi = new ImageFileInfo() { FileFullPath = filename, ImageHeight = imageHeight, ImageSize = fileSize, ImageWidth = imageWidth, ImageModDateTime = modDate, ImageOriginalDateTime = originalDateTime, }; ifi.SetFileSystemInfo(); ImageFiles.AddImageFileInfoToDictionary(ifi); ifi.InsertImageFileInfo(DBOConn); } break; case ".tiff": { List <ExifSubIfdDirectory> exifSubIfdDirectories = imageDirectories.OfType <ExifSubIfdDirectory>().ToList(); ExifIfd0Directory exifIfd0Directory = imageDirectories.OfType <ExifIfd0Directory>().FirstOrDefault(); if (exifIfd0Directory != null) { exifIfd0Directory.TryGetInt32(ExifDirectoryBase.TagImageHeight, out imageHeight); exifIfd0Directory.TryGetInt32(ExifDirectoryBase.TagImageWidth, out imageWidth); } ExifSubIfdDirectory exifSubIfdDirectory = imageDirectories.OfType <ExifSubIfdDirectory>().FirstOrDefault(d => d.ContainsTag(ExifDirectoryBase.TagDateTimeOriginal)); originalDateTime = exifSubIfdDirectory?.GetDateTime(ExifDirectoryBase.TagDateTimeOriginal); ImageFileInfo ifi = new ImageFileInfo() { FileFullPath = filename, ImageHeight = imageHeight, ImageSize = fileSize, ImageWidth = imageWidth, ImageModDateTime = modDate, ImageOriginalDateTime = originalDateTime, }; ifi.SetFileSystemInfo(); ImageFiles.AddImageFileInfoToDictionary(ifi); ifi.InsertImageFileInfo(DBOConn); } break; case ".psd": { List <ExifSubIfdDirectory> exifSubIfdDirectories = imageDirectories.OfType <ExifSubIfdDirectory>().ToList(); ExifSubIfdDirectory exifSubIfdDirectory = imageDirectories.OfType <ExifSubIfdDirectory>().FirstOrDefault(d => d.ContainsTag(ExifDirectoryBase.TagDateTimeOriginal)); originalDateTime = exifSubIfdDirectory?.GetDateTime(ExifDirectoryBase.TagDateTimeOriginal); exifSubIfdDirectory?.TryGetInt32(ExifDirectoryBase.TagExifImageHeight, out imageHeight); exifSubIfdDirectory?.TryGetInt32(ExifDirectoryBase.TagExifImageWidth, out imageWidth); ImageFileInfo ifi = new ImageFileInfo() { FileFullPath = filename, ImageHeight = imageHeight, ImageSize = fileSize, ImageWidth = imageWidth, ImageModDateTime = modDate, ImageOriginalDateTime = originalDateTime, }; ifi.SetFileSystemInfo(); ImageFiles.AddImageFileInfoToDictionary(ifi); ifi.InsertImageFileInfo(DBOConn); } break; case ".bmp": break; case ".gif": break; default: break; } } catch (Exception ex) { ImageFileInfo ifi = new ImageFileInfo() { FileFullPath = filename, }; ifi.SetFileSystemInfo(); ImageFiles.AddImageFileInfoToDictionary(ifi); } }