Exemple #1
0
        private ExifValue CreateValue()
        {
            if (!_reader.CanRead(12))
            {
                return(null);
            }

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

            if (dataType == ExifDataType.Unknown)
            {
                return(new ExifValue(tag, dataType, value, false));
            }

            uint numberOfComponents = ReadLong();

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

            uint oldIndex = _reader.Index;
            uint length   = numberOfComponents * ExifValue.GetSize(dataType);

            if (length <= 4)
            {
                value = ConvertValue(dataType, length, numberOfComponents);
            }
            else
            {
                uint newIndex = _startIndex + ReadLong();

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

                if (value == null)
                {
                    _invalidTags.Add(tag);
                    _reader.Seek(oldIndex + 4);
                    return(null);
                }
            }

            _reader.Seek(oldIndex + 4);

            bool isArray = value != null && numberOfComponents != 1;

            return(new ExifValue(tag, dataType, value, isArray));
        }
Exemple #2
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);
        }