Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to parse EXIF Date Time data

Tags:

c#

datetime

exif

I am writing a C# program that extracts the EXIF DateTimeOriginal field from a JPEG file, if that property is in the data, and I need to parse it into a DateTime value.

The code I have is:

BitmapFrame src = decoder.Frames[ 0 ];

if ( src.Metadata != null ) {
    BitmapMetadata metaData = (BitmapMetadata) src.Metadata;

    if ( metaData.ContainsQuery( "/app1/{ushort=0}/{ushort=34665}/{ushort=36867}" ) ) {
        object o = metaData.GetQuery( "/app1/{ushort=0}/{ushort=34665}/{ushort=36867}" );

        if ( o != null && o is string ) {
            string originalDate = Convert.ToString( o );

            if ( originalDate != null ) {
                if ( !DateTime.TryParseExact( originalDate.Trim(), "yyyy:MM:dd hh:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal, out createDate ) ) {
                    // Sets createDate to a default value if the date doesn't parse.
                }
            }
        }
    }
}

However, the format string in the call to TryParseExact doesn't work, as the code executes the code that is replaced with the comment.

What's the right way to write the format string? The value in the DateTimeOriginal property is formatted as YYYY:MM:DD HH:MM:SS. It's the colons in between the YYYY, MM, and DD specifiers that are killing me. Why'd they use colons??

EDIT

I tried changing the format specifier string to "yyyy\:MM\dd hh\:mm:\ss" but that didn't work, either.

like image 631
Tony Vitabile Avatar asked Mar 21 '14 20:03

Tony Vitabile


1 Answers

Here's a code snippet from an old program I have lying around that does something very similar to this:

string dateTakenText;
using (Image photo = Image.FromFile(file.Name))
{
    PropertyItem pi = photo.GetPropertyItem(Program.propertyTagExifDTOrig_);
    ASCIIEncoding enc = new ASCIIEncoding();
    dateTakenText = enc.GetString(pi.Value, 0, pi.Len - 1);
}
if (string.IsNullOrEmpty(dateTakenText))
{
    continue;
}
DateTime dateTaken;
if (!DateTime.TryParseExact(dateTakenText, "yyyy:MM:dd HH:mm:ss",
    CultureInfo.CurrentCulture, DateTimeStyles.None, out dateTaken))
{
    continue;
}

This code snippet sits inside a foreach loop, which explains the use of the continue keyword.

This is code from a program I wrote sometime back in 2002 or 2003, and I've been using it regularly since then; it works pretty reliably.

like image 144
Mark Seemann Avatar answered Oct 16 '22 10:10

Mark Seemann