internal List <IFDField> GetIFDFields <T>(IFDHeaderType block, List <byte> fileBytes, int blockDataOffset, int fieldsCount, int currentBlockTiffHeaderOffset, Endianness e, out int lastBlockByteFileOffset) { lastBlockByteFileOffset = 0; List <IFDField> result = new List <IFDField>(); byte[][] fieldsBytes = ExtractTagsBytes(ByteManager.ChopByteArray(fileBytes.ToArray(), blockDataOffset + 2, fieldsCount * 12).ToList(), fieldsCount).ToArray(); foreach (byte[] fieldBytes in fieldsBytes) { IFDField field = GetIFDField <T>(fieldBytes, e); field.Block = block; lastBlockByteFileOffset = LoadFieldTextValue <T>(ref field, fileBytes, blockDataOffset, currentBlockTiffHeaderOffset, e, lastBlockByteFileOffset); result.Add(field); } return(result); }
internal IFDHeader GetIFDHeader <T>(IFDHeaderType blockType, List <byte> fileBytes, int blockDataOffset, int tiffHeaderOffset, Endianness e) { if ((blockType == IFDHeaderType.InteroperatibilityIFD || blockType == IFDHeaderType.FirstIFD) && blockDataOffset == tiffHeaderOffset) { return(null); } int lastBlockByteFileOffset = 0; IFDHeader result = new IFDHeader(typeof(T)); byte[] fieldsCountBytes = ByteManager.ChopByteArray(fileBytes.ToArray(), blockDataOffset, 2); byte[] sortedFieldsCountBytes = SortBytes(e, fieldsCountBytes); result.FieldsCount = ByteManager.GetIntValue(sortedFieldsCountBytes); result.IFDFields = GetIFDFields <T>(blockType, fileBytes, blockDataOffset, (int)result.FieldsCount, tiffHeaderOffset, e, out lastBlockByteFileOffset); if (blockType == IFDHeaderType.ZerothIFD) { result.OffsetToNextIFD = lastBlockByteFileOffset - blockDataOffset; } else if (blockType == IFDHeaderType.ExifIFD) { var query = from f in result.IFDFields where f.FieldCode == (uint)IFDTagCode.InteropOffset select f; if (query != null && query.Count() > 0) { IFDField interopField = query.First(); result.OffsetToNextIFD = ByteManager.GetIntValue(interopField.FieldValueElements); } } byte[] offsetToNextIFDHeader = ByteManager.ChopByteArray(fileBytes.ToArray(), blockDataOffset + 2 + result.FieldsCount * 12, 4); byte[] sortedOffsetToNextIFDHeader = SortBytes(e, offsetToNextIFDHeader); int offset = ByteManager.GetIntValue(sortedOffsetToNextIFDHeader); result.OffsetTo1stIFD = offset; return(result); }