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); }
private static uint GetLength(IExifValue value) { return(GetNumberOfComponents(value) * ExifDataTypes.GetSize(value.DataType)); }