private static bool SpecialParseValue(ExifId id, ExifDataType type, byte[] data, out object temp) { temp = null; switch (id) { // Convert to DateTime case ExifId.ImageDateTime: case ExifId.ImageDateTimeOriginal: case ExifId.ImagePreviewDateTime: case ExifId.PhotoDateTimeDigitized: //case ExifId.PhotoDateTimeOriginal: // Same value as ImageDateTimeOriginal case ExifId.ThumbnailDateTime: string datestring = Encoding.ASCII.GetString(data).RemoveNullChars(); DateTime datetime; if (DateTime.TryParse(datestring, out datetime)) { temp = datetime; return true; } // Handle special cases if (DateTime.TryParseExact(datestring, "yyyy:MM:dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out datetime)) { temp = datetime; return true; } return false; // Convert to UCS-2 case ExifId.ImageXPAuthor: case ExifId.ImageXPComment: case ExifId.ImageXPSubject: case ExifId.ImageXPTitle: temp = Encoding.GetEncoding("ucs-2").GetString(data).RemoveNullChars(); return true; case ExifId.ImageXPKeywords: string keywords = Encoding.GetEncoding("ucs-2").GetString(data).RemoveNullChars(); if (keywords.Length > 0) temp = keywords.Split(new char[] { TagsSeparator }, StringSplitOptions.RemoveEmptyEntries); else temp = new string[0]; return true; default: return false; } }
private static object ParseValue(ExifId id, ExifDataType type, byte[] data) { if (type != ExifDataType.Binary && type != ExifDataType.Undefined) { if (data == null) throw new ArgumentNullException(nameof(data), String.Format("ID: {0}. Type: {1}.", id, type)); } object temp; if (SpecialParseValue(id, type, data, out temp)) return temp; switch (type) { case ExifDataType.Binary: return data; case ExifDataType.ASCII: return Encoding.ASCII.GetString(data).RemoveNullChars(); case ExifDataType.Int16: return BitConverter.ToInt16(data, 0); case ExifDataType.Int32: return BitConverter.ToInt32(data, 0); case ExifDataType.Long: return BitConverter.ToInt64(data, 0); case ExifDataType.Float: case ExifDataType.Double: return (double)BitConverter.ToInt32(data, 0) / (double)BitConverter.ToInt32(data, 4); case ExifDataType.Undefined: return data; default: throw new NotImplementedException(String.Format("Type not implemented: {0}", type)); } }