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); }
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); } }