我有点惊讶和困惑。我尝试从图像中读取属性项。我对"拍摄日期"特别感兴趣。我已经写了一个程序来做这个。或多或少。对于某些文件,它工作得很好,但是…
我有一些文件在属性中有一个"日期"(当由Windows资源管理器查看时,Windows 7 x64)。它们不同于创建、修改和访问的日期。所以我还有第四次约会。但是,如果循环遍历属性项,则不会显示它(在任何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数据之外,是否还有其他信息来源?
谢谢!
如果你想从一些基本的编码开始,你可以尝试这样做
//任意加载图片。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 );
}
嗯,我正在获取我的图像文件的"修改"日期,而不是拍摄日期。我已经实现了使用以下代码:
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);
}
将.ParseExact
行更改为以下
DateTime dateCreated = DateTime.ParseExact( ConvertToString(dateTakenProperty)**.Substring(0, 19)**, "yyyy:MM:dd HH:mm:ss", provider )
在字符串的末尾可能有一个不能处理的null
字符。为预期的长度做一个.SubString
将修复它