Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 2
0
        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));
            }
        }