public PEFFile(string aFileName)
            : base(aFileName)
        {
            byte a = mFileReader.ReadByte();
            byte b = mFileReader.ReadByte();

            bool fileIsLittleEndian;

            if (a == b && b == 'I')
            {
                fileIsLittleEndian = true;
            }
            else
            if (a == b && b == 'M')
            {
                fileIsLittleEndian = false;
            }
            else
            {
                throw new FileLoadException("Could not determine file endianess. Is this a proper TIFF/PEF file?", aFileName);
            }

            mEndianSwap = fileIsLittleEndian != BitConverter.IsLittleEndian;

            ushort magicNumber = ReadUI2();

            if (magicNumber != 42)
            {
                throw new FileLoadException("This is not a valid TIFF/PEF file: Magic number is not 42.", aFileName);
            }

            uint offsetToFirstIFD = ReadUI4();

            mFile.Seek(offsetToFirstIFD, SeekOrigin.Begin);
            List <ImageFileDirectory> ifds = new List <ImageFileDirectory>();

            while (true)
            {
                ImageFileDirectory ifd = new ImageFileDirectory(this);
                ifds.Add(ifd);
                uint offsetToNext = ReadUI4();
                if (offsetToNext == 0)
                {
                    break;
                }
                Seek(offsetToNext, System.IO.SeekOrigin.Begin);
            }

            //Raw Data:
            ImageFileDirectory raw  = ifds[0];
            IFDExif            exif = raw.GetEntry <IFDExif>();

            mISO      = exif.GetEntry <ExifEntry.ExifISOSpeedRatings>().Value;
            mBitDepth = raw.GetEntry <IFDBitsPerSample>().Value;
            ExifEntry.ExifMakerNote makernote = exif.GetEntry <ExifEntry.ExifMakerNote>();
            mBayerPattern = exif.GetEntry <ExifEntry.ExifCFAPattern>().Value;
            mBayerWidth   = exif.GetEntry <ExifEntry.ExifCFAPattern>().xCount;
            mBayerHeight  = exif.GetEntry <ExifEntry.ExifCFAPattern>().yCount;
            MNHuffmanTable huffmanTable = makernote.Value.GetEntry <MNHuffmanTable>();

            mWhiteLevel = makernote.Value.GetEntry <MNWhiteLevel>();
            mWhitePoint = makernote.Value.GetEntry <MNWhitePoint>();
            mBlackPoint = makernote.Value.GetEntry <MNBlackPoint>();
            mScaling    = makernote.Value.GetEntry <MNDataScaling>();

            mWidth  = (int)raw.GetEntry <IFDImageWidth>().Value;
            mHeight = (int)raw.GetEntry <IFDImageLength>().Value;
            uint offset = raw.GetEntry <IFDStripOffsets>().Value[0];

            Seek(offset, SeekOrigin.Begin);
            mRawImage    = new ushort[mHeight, mWidth];
            int[,] vpred = new int[2, 2];
            int[] hpred = new int[2];

            unsafe
            {
                fixed(ushort *huff = huffmanTable.Value)
                {
                    getbithuff(-1, null);

                    for (int row = 0; row < mHeight; row++)
                    {
                        for (int col = 0; col < mWidth; col++)
                        {
                            int diff = ljpeg_diff(huff);
                            if (col < 2)
                            {
                                hpred[col] = vpred[row & 1, col] += diff;
                            }
                            else
                            {
                                hpred[col & 1] += diff;
                            }
                            mRawImage[row, col] = (ushort)hpred[col & 1];
                        }
                    }
                }
            }
        }
        public PEFFile(string aFileName, bool HeaderOnly)
            : base(aFileName)
        {
            byte a = mFileReader.ReadByte();
            byte b = mFileReader.ReadByte();

            bool fileIsLittleEndian;

            if (a == b && b == 'I')
            {
                fileIsLittleEndian = true;
            }
            else
            if (a == b && b == 'M')
            {
                fileIsLittleEndian = false;
            }
            else
            {
                throw new FileLoadException("Could not determine file endianess. Is this a proper TIFF/PEF file?", aFileName);
            }

            mEndianSwap = fileIsLittleEndian != BitConverter.IsLittleEndian;

            ushort magicNumber = ReadUI2();

            if (magicNumber != 42)
            {
                throw new FileLoadException("This is not a valid TIFF/PEF file: Magic number is not 42.", aFileName);
            }

            uint offsetToFirstIFD = ReadUI4();

            mFile.Seek(offsetToFirstIFD, SeekOrigin.Begin);
            List <ImageFileDirectory> ifds = new List <ImageFileDirectory>();

            while (true)
            {
                ImageFileDirectory ifd = new ImageFileDirectory(this);
                ifds.Add(ifd);
                uint offsetToNext = ReadUI4();
                if (offsetToNext == 0)
                {
                    break;
                }
                Seek(offsetToNext, System.IO.SeekOrigin.Begin);
            }

            //Raw Data:
            ImageFileDirectory raw  = ifds[0];
            IFDExif            exif = raw.GetEntry <IFDExif>();

            mISO      = exif.GetEntry <ExifEntry.ExifISOSpeedRatings>().Value;
            mBitDepth = raw.GetEntry <IFDBitsPerSample>().Value;
            ExifEntry.ExifMakerNote makernote = exif.GetEntry <ExifEntry.ExifMakerNote>();
            mBayerPattern = exif.GetEntry <ExifEntry.ExifCFAPattern>().Value;
            mBayerWidth   = exif.GetEntry <ExifEntry.ExifCFAPattern>().xCount;
            mBayerHeight  = exif.GetEntry <ExifEntry.ExifCFAPattern>().yCount;
            MNHuffmanTable huffmanTable = makernote.Value.GetEntry <MNHuffmanTable>();

            mWhiteLevel = makernote.Value.GetEntry <MNWhiteLevel>();
            mWhitePoint = makernote.Value.GetEntry <MNWhitePoint>();
            mBlackPoint = makernote.Value.GetEntry <MNBlackPoint>();
            mScaling    = makernote.Value.GetEntry <MNDataScaling>();

            mWidth  = (int)raw.GetEntry <IFDImageWidth>().Value;
            mHeight = (int)raw.GetEntry <IFDImageLength>().Value;
            uint offset = raw.GetEntry <IFDStripOffsets>().Value[0];
        }