写真の撮影日時を秒まで取得する

以前にファイルのプロパティ取得関連について、GetDetailsOfでファイルプロパティを取得するの記事で書いたんですが、日時の属性は年月日・時間・分までは取得できますが、秒は取得できません。

例えば、撮影日時をGetDetailsOfで取得するとき、引数は「12」を与えれば取得できますが、あくまで分までです。以下はGetDetailsOfを使って撮影日時を分まで取得するサンプルです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //ファイルプロパティを取得する
            GetFileProperty();
        }

        //ファイルプロパティを取得する
        [STAThread]
        static void GetFileProperty()
        {
            String targetFolder = "D:\\test";
            System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(targetFolder);
            System.IO.FileInfo[] files = di.GetFiles("*.*");

            var shellAppType = Type.GetTypeFromProgID("Shell.Application");
            dynamic shell = Activator.CreateInstance(shellAppType);

            foreach (System.IO.FileInfo f in files)
            {
                var strFileName = f.FullName;
                Shell32.Folder objFolder = shell.NameSpace(System.IO.Path.GetDirectoryName(strFileName));
                Shell32.FolderItem folderItem = objFolder.ParseName(System.IO.Path.GetFileName(strFileName));

                //ファイル名
                String filename = objFolder.GetDetailsOf(folderItem, 0);
                System.Diagnostics.Debug.WriteLine("ファイル名: " + filename);
                //撮影日時
                String picDate = objFolder.GetDetailsOf(folderItem, 12);
                System.Diagnostics.Debug.WriteLine("撮影日時:" + picDate);
            }
        }

    }
}

この出力結果は、以下のようになります。

ファイル名: test (1).JPG
撮影日時:‎2019/‎10/‎06 ‏‎10:53
ファイル名: test (2).JPG
撮影日時:‎2019/‎10/‎22 ‏‎14:19
ファイル名: test (3).JPG
撮影日時:‎2019/‎10/‎06 ‏‎10:55

出力結果の通り、撮影日時は「2019/‎10/‎06 ‏‎10:55」と分までです。作成日時や更新日時はSystem.IO.FileInfoを使って、

System.IO.FileInfo f = new System.IO.FileInfo(filePath);
Console.WriteLine(“作成日時:” + f.CreationTime.ToString());
Console.WriteLine(“更新日時:” + f.LastWriteTime.ToString());

とすれば秒まで取得できるのですが、撮影日時はFileInfoでは取得できません。ということで、撮影日時はImageから読みとって取得します。

撮影日時を秒まで取得するサンプルが以下です。※参照設定に「System.Drawing」を追加して、先頭にusingに以下2行も追加します。

using System.Drawing;
using System.Drawing.Imaging;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //撮影日時を秒まで取得する
            GetPicDateTime();
        }


        //撮影日時を秒まで取得するサンプル
        static void GetPicDateTime()
        {
            String targetFolder = "D:\\test";
            System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(targetFolder);
            System.IO.FileInfo[] files = di.GetFiles("*.*");

            foreach (System.IO.FileInfo f in files)
            {
                //ファイル名
                System.Diagnostics.Debug.WriteLine("ファイル名: " + f.Name);
                //撮影日時
                String picDate = GetPicDateTimeFromImage(f.FullName);
                System.Diagnostics.Debug.WriteLine("撮影日時:" + picDate);
            }
        }

        //撮影日時を秒まで取得する
        public static string GetPicDateTimeFromImage(string filePath)
        {
            try
            {
                using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                {
                    using (Image img = Image.FromStream(fs, false, false))
                    {
                        PropertyItem item = img.GetPropertyItem(36867);
                        //文字列に変換する
                        string picDateStr = System.Text.Encoding.UTF8.GetString(item.Value).Trim(new char[] { '\0' });
                        //DateTimeに変換
                        DateTime dt = DateTime.ParseExact(picDateStr, "yyyy:MM:dd HH:mm:ss", null);
                        //yyyy/MM/dd HH:mm:ssの書式に設定
                        picDateStr = dt.ToString("yyyy/MM/dd HH:mm:ss");

                        return picDateStr;
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            return "";
        }

    }
}

GetPicDateTimeでGetPicDateTimeFromImageのメソッドを呼び出しています。出力結果は以下です。秒まで取得できています。

ファイル名: test (1).JPG
撮影日時:2019/10/06 10:53:08
ファイル名: test (2).JPG
撮影日時:2019/10/22 14:19:07
ファイル名: test (3).JPG
撮影日時:2019/10/06 10:55:14

 

当然ですが、そもそもファイルにExif情報が含まれていない場合は、撮影日時は取得できませんので空文字を返します。

コメント

タイトルとURLをコピーしました