Exemplo n.º 1
0
        public void SetExifData(ExifSubIfdDirectory Ifd0)
        {
            if (Ifd0 == null)
            {
                return;
            }

            foreach (var tag in Ifd0.Tags)
            {
                if (tag.Name.Contains("Image Width"))
                {
                    width = int.Parse(Regex.Replace(tag.Description, @"\D", ""));
                }
                else if (tag.Name.Contains("Image Height"))
                {
                    height = int.Parse(Regex.Replace(tag.Description, @"\D", ""));
                }
                else if (tag.Name.Contains("Date/Time Original"))
                {
                    create_datetime = tag.Description;
                }
                else if (tag.Name.Contains("Body Serial Number"))
                {
                    body_serial = tag.Description;
                }
            }
        }
Exemplo n.º 2
0
        }                                                   // 짐벌 yaw : GimbalYawDegree

        public MetaData(string file_path)
        {
            try
            {
                var readers     = new IJpegSegmentMetadataReader[] { new ExifReader(), new XmpReader() };
                var directories = JpegMetadataReader.ReadMetadata(file_path, readers);

                // JPEG 파일 정보
                ExifSubIfdDirectory sub_directory = directories.OfType <ExifSubIfdDirectory>().FirstOrDefault();
                SetExifData(sub_directory);

                // DJI XMP 정보 설정
                // 드론, 짐벌 정보
                XmpDirectory xmp_directory = directories.OfType <XmpDirectory>().FirstOrDefault();
                SetXmpData(xmp_directory);
            }
            catch (JpegProcessingException e)
            {
                throw e;
            }
            catch (IOException e)
            {
                throw e;
            }
        }
Exemplo n.º 3
0
        /// <summary>Parses <see cref="ExifSubIfdDirectory" /> metadata and saves it to the <see cref="Photo" />.</summary>
        /// <param name="directory">Directory containing the F-number, ISO, shutter speed, datetime original and focal length metadata.</param>
        /// <param name="photo">Photo object used for storing metadata.</param>
        public static void Parse(this ExifSubIfdDirectory directory, Photo photo)
        {
            if (directory is null || photo is null)
            {
                return;
            }

            if (directory.TryGetSingle(ExifDirectoryBase.TagFNumber, out var fNum))
            {
                photo.FNumber = fNum;
            }

            if (directory.TryGetInt16(ExifDirectoryBase.TagIsoEquivalent, out var iso))
            {
                photo.Iso = iso;
            }

            if (directory.TryGetSingle(ExifDirectoryBase.TagShutterSpeed, out var apexValue))
            {
                photo.ShutterSpeed = MetadataConverter.ComputeShutterSpeed(apexValue);
            }

            if (directory.TryGetDateTime(ExifDirectoryBase.TagDateTimeOriginal, out var dateTimeOriginal))
            {
                photo.DateTimeOriginal = dateTimeOriginal;
            }

            if (directory.TryGetSingle(ExifDirectoryBase.TagFocalLength, out var focalLength))
            {
                photo.FocalLength = focalLength;
            }
        }
        /*
         *  [Interoperability] Interoperability Index = Recommended Exif Interoperability Rules (ExifR98)
         *  [Interoperability] Interoperability Version = 1.00
         *  [Jpeg] Data Precision = 8 bits
         *  [Jpeg] Image Width = 600 pixels
         *  [Jpeg] Image Height = 800 pixels
         *  [Jpeg] Number of Components = 3
         *  [Jpeg] Component 1 = Y component: Quantization table 0, Sampling factors 1 horiz/1 vert
         *  [Jpeg] Component 2 = Cb component: Quantization table 1, Sampling factors 1 horiz/1 vert
         *  [Jpeg] Component 3 = Cr component: Quantization table 1, Sampling factors 1 horiz/1 vert
         */

        public NikonType1MakernoteTest()
        {
            var metadata = ExifReaderTest.ProcessSegmentBytes("Tests/Data/nikonMakernoteType1.jpg.app1").ToList();

            _nikonDirectory      = metadata.OfType <NikonType1MakernoteDirectory>().SingleOrDefault();
            _exifSubIfdDirectory = metadata.OfType <ExifSubIfdDirectory>().SingleOrDefault();
            _exifIfd0Directory   = metadata.OfType <ExifIfd0Directory>().SingleOrDefault();
            _thumbDirectory      = metadata.OfType <ExifThumbnailDirectory>().SingleOrDefault();
        }
Exemplo n.º 5
0
        private int?GetIsoLevel(ExifSubIfdDirectory directory)
        {
            if (directory.TryGetInt32(ExifDirectoryBase.TagIsoEquivalent, out var iso))
            {
                return(iso);
            }

            return(null);
        }
Exemplo n.º 6
0
        private DateTime?GetTakendateTime(ExifSubIfdDirectory directory)
        {
            if (directory.TryGetDateTime(ExifDirectoryBase.TagDateTimeOriginal, out var dateTime))
            {
                return(dateTime);
            }

            return(null);
        }
        public void TestUserCommentDescription_AsciiHeaderAsciiEncoding()
        {
            var commentBytes = Encoding.UTF8.GetBytes("ASCII\x0\x0This is a comment");
            var directory    = new ExifSubIfdDirectory();

            directory.Set(ExifDirectoryBase.TagUserComment, commentBytes);
            var descriptor = new ExifSubIfdDescriptor(directory);

            Assert.Equal("This is a comment", descriptor.GetDescription(ExifDirectoryBase.TagUserComment));
        }
        public void TestUserCommentDescription_BlankAscii()
        {
            var commentBytes = Encoding.UTF8.GetBytes("ASCII\x0\x0\x0          ");
            var directory    = new ExifSubIfdDirectory();

            directory.Set(ExifDirectoryBase.TagUserComment, commentBytes);
            var descriptor = new ExifSubIfdDescriptor(directory);

            Assert.Equal(string.Empty, descriptor.GetDescription(ExifDirectoryBase.TagUserComment));
        }
        public void TestUnicodeComment_Ascii()
        {
            var commentBytes = new byte[] { 65, 83, 67, 73, 73, 0, 0, 0, 73, 32, 97, 109, 32, 97, 32, 99, 111, 109, 109, 101, 110, 116, 46, 32, 89, 101, 121, 46, 0 };
            var directory    = new ExifSubIfdDirectory();

            directory.Set(ExifDirectoryBase.TagUserComment, commentBytes);
            var descriptor = new ExifSubIfdDescriptor(directory);

            Assert.Equal("I am a comment. Yey.", descriptor.GetDescription(ExifDirectoryBase.TagUserComment));
        }
        public void TestUserCommentDescription_ZeroLengthAscii1()
        {
            // the 10-byte encoding region is only partially full
            var commentBytes = Encoding.UTF8.GetBytes("ASCII\x0\x0\x0");
            var directory    = new ExifSubIfdDirectory();

            directory.Set(ExifDirectoryBase.TagUserComment, commentBytes);
            var descriptor = new ExifSubIfdDescriptor(directory);

            Assert.Equal("ASCII", descriptor.GetDescription(ExifDirectoryBase.TagUserComment));
        }
        public void TestUserCommentDescription_ZeroLengthAscii2()
        {
            // fill the 10-byte encoding region
            var commentBytes = Encoding.UTF8.GetBytes("ASCII\x0\x0\x0\x0\x0");
            var directory    = new ExifSubIfdDirectory();

            directory.Set(ExifDirectoryBase.TagUserComment, commentBytes);
            var descriptor = new ExifSubIfdDescriptor(directory);

            Assert.Equal(string.Empty, descriptor.GetDescription(ExifDirectoryBase.TagUserComment));
        }
Exemplo n.º 12
0
        private ExifSubIfdDirectory CreateSubIfdDirectory(float fNumber, short iso, float apexValue, DateTime dateTimeOriginal, float focalLength)
        {
            var subIfdDirectory = new ExifSubIfdDirectory();

            subIfdDirectory.Set(ExifSubIfdDirectory.TagFNumber, fNumber);
            subIfdDirectory.Set(ExifSubIfdDirectory.TagIsoEquivalent, iso);
            subIfdDirectory.Set(ExifSubIfdDirectory.TagShutterSpeed, apexValue);
            subIfdDirectory.Set(ExifSubIfdDirectory.TagDateTimeOriginal, dateTimeOriginal);
            subIfdDirectory.Set(ExifSubIfdDirectory.TagFocalLength, focalLength);

            return(subIfdDirectory);
        }
        public void ParseSubIfdDirectory_NullDirectory_NoMetadata()
        {
            ExifSubIfdDirectory subIfdDirectory = null;
            var photo = new Photo("");

            subIfdDirectory.Parse(photo);

            Assert.Null(photo.FNumber);
            Assert.Null(photo.Iso);
            Assert.Null(photo.ShutterSpeed);
            Assert.Null(photo.DateTimeOriginal);
            Assert.Null(photo.FocalLength);
        }
Exemplo n.º 14
0
        public void ParseSubIfdDateTime_Nothing()
        {
            var container = new List <Directory>();
            var dir1      = new ExifSubIfdDirectory();

            container.Add(dir1);

            var provider = CultureInfo.InvariantCulture;

            var result = ReadMetaExif.ParseSubIfdDateTime(container, provider);

            Assert.AreEqual(new DateTime(), result);
        }
Exemplo n.º 15
0
        public void ExifRead_GetExifDateTimeTest_TagDateTimeOriginal()
        {
            var container = new List <Directory>();
            var dir2      = new ExifSubIfdDirectory();

            dir2.Set(ExifDirectoryBase.TagDateTimeOriginal, "2010:12:12 12:41:35");
            container.Add(dir2);

            var result = new ReadMetaExif(null).GetExifDateTime(container);
            var expectedExifDateTime = new DateTime(2010, 12, 12, 12, 41, 35);

            Assert.AreEqual(expectedExifDateTime, result);
        }
Exemplo n.º 16
0
        public void TestGetDirectoryName()
        {
            Directory subIfdDirectory = new ExifSubIfdDirectory();
            Directory ifd0Directory   = new ExifIfd0Directory();
            Directory thumbDirectory  = new ExifThumbnailDirectory();

            Assert.False(subIfdDirectory.HasError);
            Assert.False(ifd0Directory.HasError);
            Assert.False(thumbDirectory.HasError);
            Assert.Equal("Exif IFD0", ifd0Directory.Name);
            Assert.Equal("Exif SubIFD", subIfdDirectory.Name);
            Assert.Equal("Exif Thumbnail", thumbDirectory.Name);
        }
        public void TestUnicodeComment_ActualBytes()
        {
            var commentBytes = new byte[] { 85, 78, 73, 67, 79, 68, 69, 0, 84, 0, 104, 0, 105, 0, 115, 0, 32, 0, 109, 0, 97, 0, 114, 0, 109, 0, 111, 0, 116, 0, 32, 0, 105, 0, 115, 0, 32, 0, 103, 0, 101, 0, 116, 0, 116, 0, 105, 0, 110, 0, 103, 0, 32
                                            , 0, 99, 0, 108, 0, 111, 0, 115, 0, 101, 0, 46, 0, 46, 0, 46, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0,
                                            32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32
                                            , 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32,
                                            0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0, 32, 0 };
            var directory = new ExifSubIfdDirectory();

            directory.Set(ExifDirectoryBase.TagUserComment, commentBytes);
            var descriptor = new ExifSubIfdDescriptor(directory);

            Assert.Equal("This marmot is getting close...", descriptor.GetDescription(ExifDirectoryBase.TagUserComment));
        }
Exemplo n.º 18
0
        public void ParseSubIfdDateTime_NonValidDate()
        {
            var container = new List <Directory>();
            var dir1      = new ExifSubIfdDirectory();

            dir1.Set(ExifDirectoryBase.TagDateTimeOriginal, "test_not_valid_date");
            dir1.Set(ExifDirectoryBase.TagDateTimeDigitized, "test_not_valid_date");

            container.Add(dir1);

            var provider = CultureInfo.InvariantCulture;

            var result = ReadMetaExif.ParseSubIfdDateTime(container, provider);

            Assert.AreEqual(new DateTime(), result);
        }
Exemplo n.º 19
0
        private static void SetExifSubIFDProperties(IEnumerable <Directory> directories, ImageMetadata metaData)
        {
            ExifSubIfdDirectory directory = directories.OfType <ExifSubIfdDirectory>().FirstOrDefault();

            if (directory == null)
            {
                return;
            }

            metaData.ExposureTime      = directory.GetString(ExifDirectoryBase.TagExposureTime);
            metaData.FNumber           = directory.GetString(ExifDirectoryBase.TagFNumber);
            metaData.ExposureProgram   = directory.GetString(ExifDirectoryBase.TagExposureProgram);
            metaData.IsoSpeed          = directory.GetString(ExifDirectoryBase.TagIsoEquivalent);
            metaData.DateTimeOriginal  = directory.GetNullableDateTime(ExifDirectoryBase.TagDateTimeOriginal);
            metaData.DateTimeDigitized = directory.GetNullableDateTime(ExifDirectoryBase.TagDateTimeDigitized);
        }
        protected override void CreateDirectory()
        {
            if (Directories == null)
            {
                return;
            }

            if (exifDir == null)
            {
                exifDir = Directories.OfType <ExifDirectoryBase>().FirstOrDefault();
            }

            if (exifSubIfdDir == null)
            {
                exifSubIfdDir = Directories.OfType <ExifSubIfdDirectory>().FirstOrDefault();
            }
        }
Exemplo n.º 21
0
        public void ParseSubIfdDateTime_NotInFirstContainer_TagDateTimeDigitized()
        {
            var container = new List <Directory>();

            // for raw the first container does not contain dates
            var dir1 = new ExifSubIfdDirectory();

            container.Add(dir1);

            var dir2 = new ExifSubIfdDirectory();

            dir2.Set(ExifDirectoryBase.TagDateTimeDigitized, "2022:02:02 20:22:02");
            container.Add(dir2);
            var provider = CultureInfo.InvariantCulture;

            var result = ReadMetaExif.ParseSubIfdDateTime(container, provider);

            Assert.AreEqual(new DateTime(2022, 02, 02, 20, 22, 02), result);
        }
 /// <summary>
 /// 获取一个文件的Exif信息
 /// </summary>
 /// <param name="path"></param>
 /// <returns></returns>
 private ExifSubIfdDirectory GetExif(string path)
 {
     if (fileExifSubIfdDirectory.TryGetValue(path, out ExifSubIfdDirectory exif))
     {
         return(exif);
     }
     try
     {
         var metadatas           = ImageMetadataReader.ReadMetadata(path);
         ExifSubIfdDirectory dir = metadatas.OfType <ExifSubIfdDirectory>().FirstOrDefault();
         if (dir != null)
         {
             fileExifSubIfdDirectory.TryAdd(path, dir);
             return(dir);
         }
         return(null);
     }
     catch (Exception ex)
     {
         return(null);
     }
 }
Exemplo n.º 23
0
        // There is an issue with Reconyx cameras in how it stores the original 'Date / ime' metadata tag's value
        // To get around this, we first try to get that tag's value using the standard method. If it doesn't work,
        // we try again using the Reconyx-specific method.
        public static bool TryReadDateTimeOriginalFromMetadata(string filePath, out DateTime dateTime)
        {
            dateTime = DateTime.MinValue;
            // Use only on images, as video files don't contain the desired metadata.
            try
            {
                IReadOnlyList <MetadataDirectory> metadataDirectories = null;

                // Performance tweaks. Reading in sequential scan, does this speed up? Under the covers, the MetadataExtractor is using a sequential read, allowing skip forward but not random access.
                // Exif is small, do we need a big block?
                using (FileStream fS = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, 64, FileOptions.SequentialScan))
                {
                    metadataDirectories = ImageMetadataReader.ReadMetadata(fS);
                }

                ExifSubIfdDirectory exifSubIfd = metadataDirectories.OfType <ExifSubIfdDirectory>().FirstOrDefault();
                if (exifSubIfd == null)
                {
                    return(false);
                }

                if (exifSubIfd.TryGetDateTime(ExifSubIfdDirectory.TagDateTimeOriginal, out dateTime) == false)
                {
                    // We couldn't read the metadata. In case its a reconyx camera, the fallback is to use the Reconyx-specific metadata using its DateTimeOriginal tag
                    ReconyxHyperFireMakernoteDirectory reconyxMakernote = metadataDirectories.OfType <ReconyxHyperFireMakernoteDirectory>().FirstOrDefault();
                    if ((reconyxMakernote == null) || (reconyxMakernote.TryGetDateTime(ReconyxHyperFireMakernoteDirectory.TagDateTimeOriginal, out dateTime) == false))
                    {
                        return(false);
                    }
                }
                return(true);
            }
            catch
            {
                return(false);
            }
        }
Exemplo n.º 24
0
        public static bool TryGetMetadataTagDateTime(this string imageFilePath, out DateTime dateTime)
        {
            dateTime = DateTime.MinValue;

            IReadOnlyList <MetadataDirectory> directories = ImageMetadataReader.ReadMetadata(imageFilePath);

            FileTypeDirectory fileTypeDirectory = directories?
                                                  .OfType <FileTypeDirectory>()
                                                  .FirstOrDefault();

            if (fileTypeDirectory == null)
            {
                return(false);
            }

            if (fileTypeDirectory.GetDescription(FileTypeDirectory.TagDetectedFileTypeName) == "JPEG")
            {
                ExifSubIfdDirectory subIfdDirectory = directories
                                                      .OfType <ExifSubIfdDirectory>()
                                                      .FirstOrDefault();

                return(subIfdDirectory != null &&
                       subIfdDirectory.TryGetDateTime(ExifDirectoryBase.TagDateTimeOriginal, out dateTime));
            }

            if (fileTypeDirectory.GetDescription(FileTypeDirectory.TagDetectedFileTypeName) == "QuickTime")
            {
                QuickTimeMovieHeaderDirectory quickTimeMovieHeaderDirectory = directories
                                                                              .OfType <QuickTimeMovieHeaderDirectory>()
                                                                              .FirstOrDefault();

                return(quickTimeMovieHeaderDirectory != null &&
                       quickTimeMovieHeaderDirectory.TryGetDateTime(QuickTimeMovieHeaderDirectory.TagCreated, out dateTime));
            }

            return(false);
        }
        public void ParseSubIfd_ValidDirectory_AllMetadata()
        {
            // Align the data formatting for testing
            Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");

            var subIfdDirectory = new ExifSubIfdDirectory();
            var photo           = new Photo("");

            float fNumber          = 12;
            short iso              = 1200;
            var   apexValue        = 1;
            var   dateTimeOriginal = DateTime.Today;
            float focalLength      = 30;

            subIfdDirectory.Set(ExifSubIfdDirectory.TagFNumber, fNumber);
            subIfdDirectory.Set(ExifSubIfdDirectory.TagIsoEquivalent, iso);
            subIfdDirectory.Set(ExifSubIfdDirectory.TagShutterSpeed, apexValue);
            subIfdDirectory.Set(ExifSubIfdDirectory.TagDateTimeOriginal, dateTimeOriginal);
            subIfdDirectory.Set(ExifSubIfdDirectory.TagFocalLength, focalLength);

            subIfdDirectory.Parse(photo);

            var expectedShutterSpeed = "0.5 sec"; // round((1 / exp(1 * log(2))) * 10) / 10 = 0.5

            var actualFNumber          = photo.FNumber;
            var actualIso              = photo.Iso;
            var actualShutterSpeed     = photo.ShutterSpeed;
            var actualDateTimeOriginal = photo.DateTimeOriginal;
            var actualFocalLength      = photo.FocalLength;

            Assert.Equal(fNumber, actualFNumber);
            Assert.Equal(iso, actualIso);
            Assert.Equal(expectedShutterSpeed, actualShutterSpeed);
            Assert.Equal(dateTimeOriginal, actualDateTimeOriginal);
            Assert.Equal(focalLength, actualFocalLength);
        }
Exemplo n.º 26
0
        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);
            }
        }
Exemplo n.º 27
0
        public DateTimeAdjustmentEnum TryReadDateTimeOriginalFromMetadata(string folderPath, TimeZoneInfo imageSetTimeZone)
        {
            // Use only on images, as video files don't contain the desired metadata.
            try
            {
                IReadOnlyList <MetadataDirectory> metadataDirectories = null;
                // PERFORMANCE
                // IReadOnlyList<MetadataDirectory> metadataDirectories = ImageMetadataReader.ReadMetadata(this.GetFilePath(folderPath));

                // Reading in sequential scan, does this speed up? Under the covers, the MetadataExtractor is using a sequential read, allowing skip forward but not random access.
                // Exif is small, do we need a big block?
                using (FileStream fS = new FileStream(this.GetFilePath(folderPath), FileMode.Open, FileAccess.Read, FileShare.Read, 64, FileOptions.SequentialScan))
                {
                    metadataDirectories = ImageMetadataReader.ReadMetadata(fS);
                }

                ExifSubIfdDirectory exifSubIfd = metadataDirectories.OfType <ExifSubIfdDirectory>().FirstOrDefault();
                if (exifSubIfd == null)
                {
                    return(DateTimeAdjustmentEnum.MetadataNotUsed);
                }
                if (exifSubIfd.TryGetDateTime(ExifSubIfdDirectory.TagDateTimeOriginal, out DateTime dateTimeOriginal) == false)
                {
                    // We couldn't read the metadata. In case its a reconyx camera, the fallback is to use the Reconyx-specific metadata
                    ReconyxHyperFireMakernoteDirectory reconyxMakernote = metadataDirectories.OfType <ReconyxHyperFireMakernoteDirectory>().FirstOrDefault();
                    if ((reconyxMakernote == null) || (reconyxMakernote.TryGetDateTime(ReconyxHyperFireMakernoteDirectory.TagDateTimeOriginal, out dateTimeOriginal) == false))
                    {
                        return(DateTimeAdjustmentEnum.MetadataNotUsed);
                    }
                }
                DateTimeOffset exifDateTime = DateTimeHandler.CreateDateTimeOffset(dateTimeOriginal, imageSetTimeZone);

                // get the current date time
                DateTimeOffset currentDateTime = this.DateTimeIncorporatingOffset;
                // measure the extent to which the file time and 'image taken' metadata are consistent
                bool dateAdjusted = currentDateTime.Date != exifDateTime.Date;
                bool timeAdjusted = currentDateTime.TimeOfDay != exifDateTime.TimeOfDay;
                if (dateAdjusted || timeAdjusted)
                {
                    this.SetDateTimeOffset(exifDateTime);
                }

                // At least with several Bushnell Trophy HD and Aggressor models (119677C, 119775C, 119777C) file times are sometimes
                // indicated an hour before the image taken time during standard time.  This is not known to occur during daylight
                // savings time and does not occur consistently during standard time.  It is problematic in the sense time becomes
                // scrambled, meaning there's no way to detect and correct cases where an image taken time is incorrect because a
                // daylight-standard transition occurred but the camera hadn't yet been serviced to put its clock on the new time,
                // and needs to be reported separately as the change of day in images taken just after midnight is not an indicator
                // of day-month ordering ambiguity in the image taken metadata.
                bool standardTimeAdjustment = exifDateTime - currentDateTime == TimeSpan.FromHours(1);

                // snap to metadata time and return the extent of the time adjustment
                if (standardTimeAdjustment)
                {
                    return(DateTimeAdjustmentEnum.MetadataDateAndTimeOneHourLater);
                }
                if (dateAdjusted && timeAdjusted)
                {
                    return(DateTimeAdjustmentEnum.MetadataDateAndTimeUsed);
                }
                if (dateAdjusted)
                {
                    return(DateTimeAdjustmentEnum.MetadataDateUsed);
                }
                if (timeAdjusted)
                {
                    return(DateTimeAdjustmentEnum.MetadataTimeUsed);
                }
                return(DateTimeAdjustmentEnum.SameFileAndMetadataTime);
            }
            catch
            {
                return(DateTimeAdjustmentEnum.MetadataNotUsed);
            }
        }