nifti1.h
来自「DTMK软件开发包,此为开源软件,是一款很好的医学图像开发资源.」· C头文件 代码 · 共 1,370 行 · 第 1/5 页
H
1,370 行
/** \file nifti1.h
\brief Official definition of the nifti1 header. Written by Bob Cox, SSCC, NIMH.
HISTORY:
29 Nov 2007 [rickr]
- added DT_RGBA32 and NIFTI_TYPE_RGBA32
- added NIFTI_INTENT codes:
TIME_SERIES, NODE_INDEX, RGB_VECTOR, RGBA_VECTOR, SHAPE
*/
#ifndef _NIFTI_HEADER_
#define _NIFTI_HEADER_
/*****************************************************************************
** This file defines the "NIFTI-1" header format. **
** It is derived from 2 meetings at the NIH (31 Mar 2003 and **
** 02 Sep 2003) of the Data Format Working Group (DFWG), **
** chartered by the NIfTI (Neuroimaging Informatics Technology **
** Initiative) at the National Institutes of Health (NIH). **
**--------------------------------------------------------------**
** Neither the National Institutes of Health (NIH), the DFWG, **
** nor any of the members or employees of these institutions **
** imply any warranty of usefulness of this material for any **
** purpose, and do not assume any liability for damages, **
** incidental or otherwise, caused by any use of this document. **
** If these conditions are not acceptable, do not use this! **
**--------------------------------------------------------------**
** Author: Robert W Cox (NIMH, Bethesda) **
** Advisors: John Ashburner (FIL, London), **
** Stephen Smith (FMRIB, Oxford), **
** Mark Jenkinson (FMRIB, Oxford) **
******************************************************************************/
/*---------------------------------------------------------------------------*/
/* Note that the ANALYZE 7.5 file header (dbh.h) is
(c) Copyright 1986-1995
Biomedical Imaging Resource
Mayo Foundation
Incorporation of components of dbh.h are by permission of the
Mayo Foundation.
Changes from the ANALYZE 7.5 file header in this file are released to the
public domain, including the functional comments and any amusing asides.
-----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/*! INTRODUCTION TO NIFTI-1:
------------------------
The twin (and somewhat conflicting) goals of this modified ANALYZE 7.5
format are:
(a) To add information to the header that will be useful for functional
neuroimaging data analysis and display. These additions include:
- More basic data types.
- Two affine transformations to specify voxel coordinates.
- "Intent" codes and parameters to describe the meaning of the data.
- Affine scaling of the stored data values to their "true" values.
- Optional storage of the header and image data in one file (.nii).
(b) To maintain compatibility with non-NIFTI-aware ANALYZE 7.5 compatible
software (i.e., such a program should be able to do something useful
with a NIFTI-1 dataset -- at least, with one stored in a traditional
.img/.hdr file pair).
Most of the unused fields in the ANALYZE 7.5 header have been taken,
and some of the lesser-used fields have been co-opted for other purposes.
Notably, most of the data_history substructure has been co-opted for
other purposes, since the ANALYZE 7.5 format describes this substructure
as "not required".
NIFTI-1 FLAG (MAGIC STRINGS):
----------------------------
To flag such a struct as being conformant to the NIFTI-1 spec, the last 4
bytes of the header must be either the C String "ni1" or "n+1";
in hexadecimal, the 4 bytes
6E 69 31 00 or 6E 2B 31 00
(in any future version of this format, the '1' will be upgraded to '2',
etc.). Normally, such a "magic number" or flag goes at the start of the
file, but trying to avoid clobbering widely-used ANALYZE 7.5 fields led to
putting this marker last. However, recall that "the last shall be first"
(Matthew 20:16).
If a NIFTI-aware program reads a header file that is NOT marked with a
NIFTI magic string, then it should treat the header as an ANALYZE 7.5
structure.
NIFTI-1 FILE STORAGE:
--------------------
"ni1" means that the image data is stored in the ".img" file corresponding
to the header file (starting at file offset 0).
"n+1" means that the image data is stored in the same file as the header
information. We recommend that the combined header+data filename suffix
be ".nii". When the dataset is stored in one file, the first byte of image
data is stored at byte location (int)vox_offset in this combined file.
The minimum allowed value of vox_offset is 352; for compatibility with
some software, vox_offset should be an integral multiple of 16.
GRACE UNDER FIRE:
----------------
Most NIFTI-aware programs will only be able to handle a subset of the full
range of datasets possible with this format. All NIFTI-aware programs
should take care to check if an input dataset conforms to the program's
needs and expectations (e.g., check datatype, intent_code, etc.). If the
input dataset can't be handled by the program, the program should fail
gracefully (e.g., print a useful warning; not crash).
SAMPLE CODES:
------------
The associated files nifti1_io.h and nifti1_io.c provide a sample
implementation in C of a set of functions to read, write, and manipulate
NIFTI-1 files. The file nifti1_test.c is a sample program that uses
the nifti1_io.c functions.
-----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/* HEADER STRUCT DECLARATION:
-------------------------
In the comments below for each field, only NIFTI-1 specific requirements
or changes from the ANALYZE 7.5 format are described. For convenience,
the 348 byte header is described as a single struct, rather than as the
ANALYZE 7.5 group of 3 substructs.
Further comments about the interpretation of various elements of this
header are after the data type definition itself. Fields that are
marked as ++UNUSED++ have no particular interpretation in this standard.
(Also see the UNUSED FIELDS comment section, far below.)
The presumption below is that the various C types have particular sizes:
sizeof(int) = sizeof(float) = 4 ; sizeof(short) = 2
-----------------------------------------------------------------------------*/
/*=================*/
#ifdef __cplusplus
extern "C" {
#endif
/*=================*/
/*! \struct nifti_1_header
\brief Data structure defining the fields in the nifti1 header.
This binary header should be found at the beginning of a valid
NIFTI-1 header file.
*/
/*************************/ /************************/
struct nifti_1_header { /* NIFTI-1 usage */ /* ANALYZE 7.5 field(s) */
/*************************/ /************************/
/*--- was header_key substruct ---*/
int sizeof_hdr; /*!< MUST be 348 */ /* int sizeof_hdr; */
char data_type[10]; /*!< ++UNUSED++ */ /* char data_type[10]; */
char db_name[18]; /*!< ++UNUSED++ */ /* char db_name[18]; */
int extents; /*!< ++UNUSED++ */ /* int extents; */
short session_error; /*!< ++UNUSED++ */ /* short session_error; */
char regular; /*!< ++UNUSED++ */ /* char regular; */
char dim_info; /*!< MRI slice ordering. */ /* char hkey_un0; */
/*--- was image_dimension substruct ---*/
short dim[8]; /*!< Data array dimensions.*/ /* short dim[8]; */
float intent_p1 ; /*!< 1st intent parameter. */ /* short unused8; */
/* short unused9; */
float intent_p2 ; /*!< 2nd intent parameter. */ /* short unused10; */
/* short unused11; */
float intent_p3 ; /*!< 3rd intent parameter. */ /* short unused12; */
/* short unused13; */
short intent_code ; /*!< NIFTI_INTENT_* code. */ /* short unused14; */
short datatype; /*!< Defines data type! */ /* short datatype; */
short bitpix; /*!< Number bits/voxel. */ /* short bitpix; */
short slice_start; /*!< First slice index. */ /* short dim_un0; */
float pixdim[8]; /*!< Grid spacings. */ /* float pixdim[8]; */
float vox_offset; /*!< Offset into .nii file */ /* float vox_offset; */
float scl_slope ; /*!< Data scaling: slope. */ /* float funused1; */
float scl_inter ; /*!< Data scaling: offset. */ /* float funused2; */
short slice_end; /*!< Last slice index. */ /* float funused3; */
char slice_code ; /*!< Slice timing order. */
char xyzt_units ; /*!< Units of pixdim[1..4] */
float cal_max; /*!< Max display intensity */ /* float cal_max; */
float cal_min; /*!< Min display intensity */ /* float cal_min; */
float slice_duration;/*!< Time for 1 slice. */ /* float compressed; */
float toffset; /*!< Time axis shift. */ /* float verified; */
int glmax; /*!< ++UNUSED++ */ /* int glmax; */
int glmin; /*!< ++UNUSED++ */ /* int glmin; */
/*--- was data_history substruct ---*/
char descrip[80]; /*!< any text you like. */ /* char descrip[80]; */
char aux_file[24]; /*!< auxiliary filename. */ /* char aux_file[24]; */
short qform_code ; /*!< NIFTI_XFORM_* code. */ /*-- all ANALYZE 7.5 ---*/
short sform_code ; /*!< NIFTI_XFORM_* code. */ /* fields below here */
/* are replaced */
float quatern_b ; /*!< Quaternion b param. */
float quatern_c ; /*!< Quaternion c param. */
float quatern_d ; /*!< Quaternion d param. */
float qoffset_x ; /*!< Quaternion x shift. */
float qoffset_y ; /*!< Quaternion y shift. */
float qoffset_z ; /*!< Quaternion z shift. */
float srow_x[4] ; /*!< 1st row affine transform. */
float srow_y[4] ; /*!< 2nd row affine transform. */
float srow_z[4] ; /*!< 3rd row affine transform. */
char intent_name[16];/*!< 'name' or meaning of data. */
char magic[4] ; /*!< MUST be "ni1\0" or "n+1\0". */
} ; /**** 348 bytes total ****/
typedef struct nifti_1_header nifti_1_header ;
/*---------------------------------------------------------------------------*/
/* HEADER EXTENSIONS:
-----------------
After the end of the 348 byte header (e.g., after the magic field),
the next 4 bytes are a char array field named "extension". By default,
all 4 bytes of this array should be set to zero. In a .nii file, these
4 bytes will always be present, since the earliest start point for
the image data is byte #352. In a separate .hdr file, these bytes may
or may not be present. If not present (i.e., if the length of the .hdr
file is 348 bytes), then a NIfTI-1 compliant program should use the
default value of extension={0,0,0,0}. The first byte (extension[0])
is the only value of this array that is specified at present. The other
3 bytes are reserved for future use.
If extension[0] is nonzero, it indicates that extended header information
is present in the bytes following the extension array. In a .nii file,
this extended header data is before the image data (and vox_offset
must be set correctly to allow for this). In a .hdr file, this extended
data follows extension and proceeds (potentially) to the end of the file.
The format of extended header data is weakly specified. Each extension
must be an integer multiple of 16 bytes long. The first 8 bytes of each
extension comprise 2 integers:
int esize , ecode ;
These values may need to be byte-swapped, as indicated by dim[0] for
the rest of the header.
* esize is the number of bytes that form the extended header data
+ esize must be a positive integral multiple of 16
+ this length includes the 8 bytes of esize and ecode themselves
* ecode is a non-negative integer that indicates the format of the
extended header data that follows
+ different ecode values are assigned to different developer groups
+ at present, the "registered" values for code are
= 0 = unknown private format (not recommended!)
= 2 = DICOM format (i.e., attribute tags and values)
= 4 = AFNI group (i.e., ASCII XML-ish elements)
In the interests of interoperability (a primary rationale for NIfTI),
groups developing software that uses this extension mechanism are
encouraged to document and publicize the format of their extensions.
To this end, the NIfTI DFWG will assign even numbered codes upon request
to groups submitting at least rudimentary documentation for the format
of their extension; at present, the contact is mailto:rwcox@nih.gov.
The assigned codes and documentation will be posted on the NIfTI
website. All odd values of ecode (and 0) will remain unassigned;
at least, until the even ones are used up, when we get to 2,147,483,646.
Note that the other contents of the extended header data section are
totally unspecified by the NIfTI-1 standard. In particular, if binary
data is stored in such a section, its byte order is not necessarily
the same as that given by examining dim[0]; it is incumbent on the
programs dealing with such data to determine the byte order of binary
extended header data.
Multiple extended header sections are allowed, each starting with an
esize,ecode value pair. The first esize value, as described above,
is at bytes #352-355 in the .hdr or .nii file (files start at byte #0).
If this value is positive, then the second (esize2) will be found
starting at byte #352+esize1 , the third (esize3) at byte #352+esize1+esize2,
et cetera. Of course, in a .nii file, the value of vox_offset must
be compatible with these extensions. If a malformed file indicates
that an extended header data section would run past vox_offset, then
the entire extended header section should be ignored. In a .hdr file,
if an extended header data section would run past the end-of-file,
that extended header data should also be ignored.
With the above scheme, a program can successively examine the esize
and ecode values, and skip over each extended header section if the
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?