Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }