コード例 #1
0
 public ImageFileDirectory(FileReader aPefFile)
 {
     mPefFile    = aPefFile;
     mEntries    = new List <ImageFileDirectoryEntry>();
     mEntryCount = mPefFile.ReadUI2();
     for (ushort i = 0; i < mEntryCount; i++)
     {
         ImageFileDirectoryEntry entry = ImageFileDirectoryEntry.CreateImageFileDirectoryEntry(mPefFile);
         mEntries.Add(entry);
     }
 }
コード例 #2
0
    /// <summary>
    ///     Returns a <see cref="ImageFileDirectory" /> initialized from the given byte data.
    /// </summary>
    /// <param name="data">The data.</param>
    /// <param name="offset">The offset into <paramref name="data" />.</param>
    /// <param name="byteOrder">The byte order of <paramref name="data" />.</param>
    /// <returns>A <see cref="ImageFileDirectory" /> initialized from the given byte data.</returns>
    public static ImageFileDirectory FromBytes(byte[] data, uint offset, BitConverterEx.ByteOrder byteOrder)
    {
        var ifd  = new ImageFileDirectory();
        var conv = new BitConverterEx(byteOrder, BitConverterEx.SystemByteOrder);

        var stripOffsets = new List <uint>();
        var stripLengths = new List <uint>();

        // Count
        var fieldcount = conv.ToUInt16(data, offset);

        // Read fields
        for (uint i = 0; i < fieldcount; i++)
        {
            var fieldoffset = offset + 2 + (12 * i);
            var field       = ImageFileDirectoryEntry.FromBytes(data, fieldoffset, byteOrder);
            ifd.Fields.Add(field);

            // Read strip offsets
            if (field.Tag == 273)
            {
                var baselen = field.Data.Length / (int)field.Count;
                for (uint j = 0; j < field.Count; j++)
                {
                    var val = new byte[baselen];
                    Array.Copy(field.Data, j * baselen, val, 0, baselen);
                    var stripOffset = field.Type == 3 ? BitConverter.ToUInt16(val, 0) : BitConverter.ToUInt32(val, 0);
                    stripOffsets.Add(stripOffset);
                }
            }

            // Read strip lengths
            if (field.Tag == 279)
            {
                var baselen = field.Data.Length / (int)field.Count;
                for (uint j = 0; j < field.Count; j++)
                {
                    var val = new byte[baselen];
                    Array.Copy(field.Data, j * baselen, val, 0, baselen);
                    var stripLength = field.Type == 3 ? BitConverter.ToUInt16(val, 0) : BitConverter.ToUInt32(val, 0);
                    stripLengths.Add(stripLength);
                }
            }
        }

        // Save strips
        if (stripOffsets.Count != stripLengths.Count)
        {
            throw new NotValidTIFFileException();
        }

        for (var i = 0; i < stripOffsets.Count; i++)
        {
            ifd.Strips.Add(new TIFFStrip(data, stripOffsets[i], stripLengths[i]));
        }

        // Offset to next ifd
        ifd.NextIFDOffset = conv.ToUInt32(data, offset + 2 + (12 * fieldcount));

        return(ifd);
    }