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

            var       tag      = (ExifTagValue)ReadShort();
            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;
            }

            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) && _reader.CanRead(length))
                {
                    value = CreateValue(tag, dataType, numberOfComponents);
                }
            }

            if (value == null)
            {
                InvalidTags.Add(new UnkownExifTag(tag));
            }

            _reader.Seek(oldIndex + 4);

            return(value);
        }
コード例 #2
0
        public void Read(byte[] data)
        {
            Values.Clear();
            InvalidTags.Clear();

            if (data == null || data.Length == 0)
            {
                return;
            }

            _reader = new EndianReader(data);

            if (_reader.ReadString(4) == "Exif")
            {
                if (_reader.ReadShortMSB() != 0)
                {
                    return;
                }

                _startIndex = 6;
            }

            _isLittleEndian = _reader.ReadString(2) == "II";

            if (ReadShort() != 0x002A)
            {
                return;
            }

            var ifdOffset = ReadLong();

            AddValues(Values, ifdOffset);

            var thumbnailOffset = ReadLong();

            ReadThumbnail(thumbnailOffset);

            if (_exifOffset != 0)
            {
                AddValues(Values, _exifOffset);
            }

            if (_gpsOffset != 0)
            {
                AddValues(Values, _gpsOffset);
            }
        }