Training for D-Day

ブログの内容は個人の見解であり、所属する企業を代表するものではありません。

.NET C# JPEGのEXIF情報から撮影日を取得して、ファイルの作成日を更新する

パソコンを買った目的の一つとして、今までMacBook+外付けHDD(USB3.0)で管理していた写真にパフォーマンス的に限界を感じたからです。
Windowsにして、自由に管理するか、AdobeLightRoomにするかちょっと悩んでいます。月額980円だもんなー。300円ならいいんだけど。

さすがにSSD 1TBは買えない。10万ぐらいするし。。

www.akibakan.com


やはりJobsがいなくなった後のAppleは迷走しているような気がしないでもない。
MacのPhotos使えないよ。iPhotoやApertureに代わると期待してたのに。

weekly.ascii.jp

ジョニーさん頑張ってくれよ。デザインはいいんだけど。

kshimizu.hatenadiary.jp


Windowsにして、自由に管理するか、AdobeLightRoomにするかちょっと悩んでいます。月額980円だもんなー。300円ならいいんだけど。

写真編集・加工ソフト | Adobe Lightroom CC


とりあえず、自分で作ろうということになった。

その前に、写真自体を管理しないといけない。

で、
.NET C# JPEGEXIF情報から撮影日を取得して、ファイルの作成日を更新する
簡単なプログラムを作りました。


class Program
    {
        static char [] zero = { '\0' };

        static void Main(string[] args)
        {

            var jpegs = Directory .GetFiles(@"D:\Pictures\", "*.jpg", SearchOption .AllDirectories);
            System.Globalization. CultureInfo japaneseCultureInfo = new System.Globalization.CultureInfo ("ja-JP");

            Console.WriteLine(string .Format("{0}件取得しました。",jpegs.Count()));
            int i = 1;
            foreach (var jpegFileFullPath in jpegs)
            {
                Console.WriteLine(string .Format("{0:D6}件目 FilePath={1} 処理します。" ,i, jpegFileFullPath));

                DateTime dt = DateTime .MaxValue;
                using (var bmp = new Bitmap(jpegFileFullPath))
                {
                    foreach (System.Drawing.Imaging.PropertyItem item in bmp.PropertyItems)
                    {
                        if (item.Id == 0x9003 && item.Type == 2)
                        {
                            string val = System.Text.Encoding .ASCII.GetString(item.Value);
                            val = val.Trim(zero);
                            if (DateTime .TryParseExact(val, "yyyy:MM:dd HH:mm:ss", null, System.Globalization.DateTimeStyles .None, out dt))
                            {
                            }
                            // 和暦が2桁で年のところに入っている場合がある。その場合は一度西暦変換して、12年を引く。(=和暦年になる)(平成固定)
                            else if (val.Length > 2 && IsNumeric(val.Substring(0, 2)))
                            {
                                if (DateTime .TryParseExact(val, "yy:MM:dd HH:mm:ss", japaneseCultureInfo, System.Globalization.DateTimeStyles .AssumeLocal, out dt))
                                {
                                    dt = dt.AddYears(-12);
                                }
                            }
                            break;

                        }
                    }                   
                }
                if (dt != DateTime .MaxValue)
                {
                    if( dt != DateTime .MinValue )
                    {
                        try
                        {
                            var creationDate = System.IO.File .GetCreationTime(jpegFileFullPath);
                            if(creationDate != dt)
                            {

                                System.IO. File.SetCreationTime(jpegFileFullPath, dt);
                            }
                        }
                        catch
                        {
                            Console.WriteLine("作成日を設定できませんでした。{0}" , jpegFileFullPath);
                        }
                    }
                }
                i++;

            }


        }

        static bool IsNumeric( string value )
        {
            foreach (char c in value)
            {
                if (c < '0' || '9' < c)
                {
                    return false ;
                }
            }
            return true ;
        }

    }

クソコードだな、こりゃ。
まぁいいか。



次は、作成日から年月日フォルダ(yyyy-MM-dd)へ振り分けるプログラムを作ろうと思います。