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

            var       tagValue = (ExifTagValue)ReadShort();
            var       tag      = ExifTag.Get(tagValue);
            var       dataType = EnumHelper.Parse(ReadShort(), ExifDataType.Unknown);
            ExifValue value    = null;

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

            var numberOfComponents = ReadLong();

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

            if (tag == null)
            {
                if (numberOfComponents == 1)
                {
                    _invalidTags.Add(new ExifTag <byte>(tagValue));
                }
                else
                {
                    _invalidTags.Add(new ExifTag <byte[]>(tagValue));
                }

                return(null);
            }

            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(ExifValue value) => GetNumberOfComponents(value) * ExifDataTypes.GetSize(value.DataType);