Пример #1
0
        private static NiftiHeader ReadHeader(Stream stream)
        {
            bool reverseBytes = false;

            //var memstrem = new MemoryStream();
            //stream.CopyTo(memstrem);

            var streamLen = stream.Length;

            NiftiHeader hdr = new NiftiHeader();

            hdr.sizeof_hdr = ReadInt(stream, reverseBytes);

            reverseBytes = hdr.SourceIsBigEndian();

            hdr.data_type     = ReadBytes(stream, 10);
            hdr.db_name       = ReadBytes(stream, 18);
            hdr.extents       = ReadInt(stream, reverseBytes);
            hdr.session_error = ReadShort(stream, reverseBytes);
            hdr.regular       = ReadByte(stream);
            hdr.dim_info      = ReadByte(stream);

            hdr.dim            = ReadMyShorts(stream, 8, reverseBytes);
            hdr.intent_p1      = ReadFloat(stream, reverseBytes);
            hdr.intent_p2      = ReadFloat(stream, reverseBytes);
            hdr.intent_p3      = ReadFloat(stream, reverseBytes);
            hdr.intent_code    = ReadShort(stream, reverseBytes);
            hdr.datatype       = ReadShort(stream, reverseBytes);
            hdr.bitpix         = ReadShort(stream, reverseBytes);
            hdr.slice_start    = ReadShort(stream, reverseBytes);
            hdr.pixdim         = ReadFloats(stream, 8, reverseBytes);
            hdr.vox_offset     = ReadFloat(stream, reverseBytes);
            hdr.scl_slope      = ReadFloat(stream, reverseBytes);
            hdr.scl_inter      = ReadFloat(stream, reverseBytes);
            hdr.slice_end      = ReadShort(stream, reverseBytes);
            hdr.slice_code     = ReadByte(stream);
            hdr.xyzt_units     = ReadByte(stream);
            hdr.cal_max        = ReadFloat(stream, reverseBytes);
            hdr.cal_min        = ReadFloat(stream, reverseBytes);
            hdr.slice_duration = ReadFloat(stream, reverseBytes);
            hdr.toffset        = ReadFloat(stream, reverseBytes);
            hdr.glmax          = ReadInt(stream, reverseBytes);
            hdr.glmin          = ReadInt(stream, reverseBytes);

            hdr.descrip  = ReadBytes(stream, 80);
            hdr.aux_file = ReadBytes(stream, 24);

            hdr.qform_code = ReadShort(stream, reverseBytes);
            hdr.sform_code = ReadShort(stream, reverseBytes);

            hdr.quatern_b = ReadFloat(stream, reverseBytes);
            hdr.quatern_c = ReadFloat(stream, reverseBytes);
            hdr.quatern_d = ReadFloat(stream, reverseBytes);
            hdr.qoffset_x = ReadFloat(stream, reverseBytes);
            hdr.qoffset_y = ReadFloat(stream, reverseBytes);
            hdr.qoffset_z = ReadFloat(stream, reverseBytes);

            hdr.srow_x = ReadFloats(stream, 4, reverseBytes);
            hdr.srow_y = ReadFloats(stream, 4, reverseBytes);
            hdr.srow_z = ReadFloats(stream, 4, reverseBytes);

            hdr.intent_name = ReadBytes(stream, 16);
            hdr.magic       = ReadBytes(stream, 4);

            if (streamLen >= 352)
            {
                hdr.extension = ReadBytes(stream, 4);

                if (hdr.extension[0] == 1) // Extension is present
                {
                    hdr.esize = ReadInt(stream, reverseBytes);
                    hdr.ecode = ReadInt(stream, reverseBytes);
                    hdr.edata = ReadBytes(stream, hdr.esize - 8);
                }
            }

            if (TypeOf(hdr) == FileType.UNKNOWN)
            {
                throw new InvalidDataException("Not a NIfTI file (no magic bytes)");
            }
            if (hdr.dim[0] > 7)
            {
                throw new InvalidDataException("NIFTI header is using more than 7 dimensions. I don't really know how to handle that :\\");
            }
            else if (hdr.dim[0] < 0)
            {
                throw new InvalidDataException("Somethings broken with the dimensions...");
            }

            return(hdr);
        }
Пример #2
0
        private static dynamic ReadData(Stream stream, NiftiHeader hdr, short forceType)
        {
            var datatype     = forceType != NiftiHeader.DT_UNKNOWN ? forceType : hdr.datatype;
            var reverseBytes = hdr.SourceIsBigEndian();
            var bytelen      = stream.Length - stream.Position;
            var data         = InitData(datatype, bytelen);

            switch (datatype)
            {
            case NiftiHeader.DT_FLOAT32:
                for (int i = 0; i < data.Length; ++i)
                {
                    data[i] = ReadFloat(stream, reverseBytes);
                }
                break;

            case NiftiHeader.DT_INT32:
                for (int i = 0; i < data.Length; ++i)
                {
                    data[i] = ReadInt(stream, reverseBytes);
                }
                break;

            case NiftiHeader.DT_UINT32:
                for (int i = 0; i < data.Length; ++i)
                {
                    data[i] = ReadInt(stream, reverseBytes);
                }
                break;

            case NiftiHeader.DT_INT16:
                for (int i = 0; i < data.Length; ++i)
                {
                    data[i] = ReadShort(stream, reverseBytes);
                }
                break;

            case NiftiHeader.DT_UINT16:
                for (int i = 0; i < data.Length; ++i)
                {
                    data[i] = ReadUShort(stream, reverseBytes);
                }
                break;

            case NiftiHeader.DT_DOUBLE:
                for (int i = 0; i < data.Length; ++i)
                {
                    data[i] = ReadDouble(stream, reverseBytes);
                }
                break;

            case NiftiHeader.DT_COMPLEX:
                for (int i = 0; i < data.Length; ++i)
                {
                    data[i] = ReadLong(stream, reverseBytes);
                }
                break;

            case NiftiHeader.DT_RGB24:
                for (int i = 0; i < data.Length; ++i)
                {
                    data[i] = ReadRGB(stream, reverseBytes);
                }
                break;

            case NiftiHeader.DT_RGBA32:
                for (int i = 0; i < data.Length; ++i)
                {
                    data[i] = ReadRGBA(stream, reverseBytes);
                }
                break;

            default:
                for (int i = 0; i < data.Length; ++i)
                {
                    data[i] = ReadByte(stream);
                }
                break;
            }

            return(data);
        }