3

ちょっと驚きと戸惑いです。画像からプロパティ項目を読み込もうとしています。特に「Date Taken」に興味があります。私はまさにそれを行う手順を書きました。多かれ少なかれ。一部のファイルでは完全に機能しますが...

プロパティに「撮影日」が含まれるファイルがいくつかあります (Windows エクスプローラー、Windows 7 x64 で表示した場合)。それらは、作成、変更、およびアクセスされた日付とは異なります。だから私は4回目のデートをしています。ただし、プロパティ項目をループすると、(どの ID でも) 表示されません。PropertyItem.Id (0x9003 または 36867) で検索すると、プロパティ項目が存在しないことがわかります。

プロパティ項目をループするマイ コード:

        for (int i = 0; i < fileNames.Length; i++)
        {
            FileStream fs = new FileStream(fileNames[i], FileMode.Open, FileAccess.Read);
            Image pic = Image.FromStream(fs, false, false);



            int t = 0;
            foreach (PropertyItem pii in pic.PropertyItems)
            {
                MessageBox.Show(encoding.GetString(pii.Value, 0, pii.Len - 1) + " - ID: " + t.ToString());
                t++;
            }
        }

「Date Taken」プロパティのみを読み取るコード (ここから盗みました: http://snipplr.com/view/25074/ )

    public static DateTime DateTaken(Image getImage)
    {
        int DateTakenValue = 0x9003; //36867;

        if (!getImage.PropertyIdList.Contains(DateTakenValue))
            return DateTime.Parse("01-01-2000");

        string dateTakenTag = System.Text.Encoding.ASCII.GetString(getImage.GetPropertyItem(DateTakenValue).Value);
        string[] parts = dateTakenTag.Split(':', ' ');
        int year = int.Parse(parts[0]);
        int month = int.Parse(parts[1]);
        int day = int.Parse(parts[2]);
        int hour = int.Parse(parts[3]);
        int minute = int.Parse(parts[4]);
        int second = int.Parse(parts[5]);

        return new DateTime(year, month, day, hour, minute, second);
    }

しかし、Windows エクスプローラーの「ファイル プロパティ ウィンドウ」で取得した日付を変更すると、プログラムに表示され始めます。

だから私の質問は:この「撮影日」はどこから来たのですか?どうすればアクセスできますか? EFIX データ以外に別の情報源があるのではないでしょうか?

ありがとう!

4

3 に答える 3

13

基本的なコーディングから始めたい場合は、このようなものを試すことができます

// 好きなように画像をロードします。System.Drawing.Image image = new Bitmap("my-picture.jpg");

Referenced from AbbydonKrafts

// Get the Date Created property 
//System.Drawing.Imaging.PropertyItem propertyItem = image.GetPropertyItem( 0x132 );
System.Drawing.Imaging.PropertyItem propertyItem 
         = image.PropertyItems.FirstOrDefault(i => i.Id == 0x132 ); 
if( propItem != null ) 
{ 
  // Extract the property value as a String. 
  System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
  string text = encoding.GetString(propertyItem.Value, 0, propertyItem.Len - 1 ); 

  // Parse the date and time. 
  System.Globalization.CultureInfo provider = CultureInfo.InvariantCulture; 
  DateTime dateCreated = DateTime.ParseExact( text, "yyyy:MM:d H:m:s", provider ); 
}
于 2013-01-13T21:29:52.490 に答える
1

さて、撮影日ではなく、画像ファイルの「変更」日を取得しています。次のコードを使用して達成しました:

public static System.DateTime GetImageDate(string filePath)
  {
     System.Drawing.Image myImage = Image.FromFile(filePath);
     System.Drawing.Imaging.PropertyItem propItem = myImage.GetPropertyItem(36867);
     string dateTaken = new System.Text.RegularExpressions.Regex(":").Replace(System.Text.Encoding.UTF8.GetString(propItem.Value), "-", 2);
     return System.DateTime.Parse(dateTaken);
  }
于 2016-07-16T04:44:41.970 に答える