コード例 #1
0
        private IExifValue CreateValue()
        {
            if (!_reader.CanRead(12))
            {
                return(null);
            }

            var        tag      = (ExifTag)ReadShort();
            var        dataType = EnumHelper.Parse(ReadShort(), ExifDataType.Unknown);
            IExifValue value    = null;

            if (dataType == ExifDataType.Unknown)
            {
                return(null);
            }

            var numberOfComponents = ReadLong();

            if (dataType == ExifDataType.Undefined && numberOfComponents == 0)
            {
                numberOfComponents = 4;
            }

            var oldIndex = _reader.Index;
            var length   = numberOfComponents * ExifDataTypes.GetSize(dataType);

            if (length <= 4)
            {
                value = CreateValue(tag, dataType, numberOfComponents);
            }
            else
            {
                var newIndex = _startIndex + ReadLong();

                if (_reader.Seek(newIndex))
                {
                    if (_reader.CanRead(length))
                    {
                        value = CreateValue(tag, dataType, numberOfComponents);
                    }
                }

                if (value == null)
                {
                    _invalidTags.Add(tag);
                }
            }

            _reader.Seek(oldIndex + 4);

            return(value);
        }
コード例 #2
0
 private static uint GetLength(IExifValue value)
 {
     return(GetNumberOfComponents(value) * ExifDataTypes.GetSize(value.DataType));
 }