.NET C# JPEGのEXIF情報から撮影日を取得して、ファイルの作成日を更新する
パソコンを買った目的の一つとして、今までMacBook+外付けHDD(USB3.0)で管理していた写真にパフォーマンス的に限界を感じたからです。 Windowsにして、自由に管理するか、AdobeのLightRoomにするかちょっと悩んでいます。月額980円だもんなー。300円ならいいんだけど。 さすがにSSD 1TBは買えない。10万ぐらいするし。。
やはりJobsがいなくなった後のAppleは迷走しているような気がしないでもない。 MacのPhotos使えないよ。iPhotoやApertureに代わると期待してたのに。
ジョニーさん頑張ってくれよ。デザインはいいんだけど。
Windowsにして、自由に管理するか、AdobeのLightRoomにするかちょっと悩んでいます。月額980円だもんなー。300円ならいいんだけど。
写真編集・加工ソフト | Adobe Lightroom CC
とりあえず、自分で作ろうということになった。 その前に、写真自体を管理しないといけない。 で、 .NET C# JPEGのEXIF情報から撮影日を取得して、ファイルの作成日を更新する 簡単なプログラムを作りました。
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)へ振り分けるプログラムを作ろうと思います。