You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/3rd/VTK7.1/include/vtkmetaio/metaImage.h

388 lines
13 KiB
C

/*============================================================================
MetaIO
Copyright 2000-2010 Insight Software Consortium
Distributed under the OSI-approved BSD License (the "License");
see accompanying file Copyright.txt for details.
This software is distributed WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the License for more information.
============================================================================*/
#include "metaTypes.h"
#ifndef ITKMetaIO_METAIMAGE_H
#define ITKMetaIO_METAIMAGE_H
#include "metaUtils.h"
#include "metaObject.h"
#include "metaImageTypes.h"
#include "metaImageUtils.h"
/*! MetaImage (.h and .cpp)
*
* Description:
* Reads and Writes MetaImageFiles.
* MetaImageFiles can be in one of two possible formats:
* a combined header/data format, typically designated .mha files
* or as separate header and data files, typically designated
* .mhd and .mda files
*
* Features:
* Header information is in ascii format - for easy creation, editing,
* and review. If separate files are used, a specified number of
* header-bytes in the datafile can be skipped
* - in this manner, different file formats (e.g., bmp, img,
* and /usr/Image) can be converted to metaImageFile format by
* merely specifying a separate text header (.mhd) file and in that
* file specifying how many data-header-bytes should be skipped.
* Thereby the data files can serve a dual role (as bitmap files
* and as metaImage data files)
* Supports all pixel formats
* Handles byte ordering (MSB/LSB)
* Provides the ability to handle associated medical image
* information (element size, element spacing, etc).
* Has required and optional header data (provides rapid formation
* or extensive documentation).
* REQUIRED: NDims, DimSize, ByteOrderMSB, ElementDataType, DataFileName
*
* \author Stephen R. Aylward
*
* \date August 29, 1999
*
* Depends on:
* MetaUtils.h
* MetaFileLib.h
*/
#if (METAIO_USE_NAMESPACE)
namespace METAIO_NAMESPACE {
#endif
class METAIO_EXPORT MetaImage : public MetaObject
{
public:
////
//
// Constructors & Destructor
//
////
MetaImage(void);
MetaImage(const char *_headerName);
MetaImage(MetaImage *_im); // share memory
MetaImage(int _nDims,
const int * _dimSize,
const float *_elementSpacing,
MET_ValueEnumType _elementType,
int _elementNumberOfChannels=1,
void *_elementData=NULL);
MetaImage(int _x, int _y,
float _elementSpacingX,
float _elementSpacingY,
MET_ValueEnumType _elementType,
int _elementNumberOfChannels=1,
void *_elementData=NULL);
MetaImage(int _x, int _y, int _z,
float _elementSpacingX,
float _elementSpacingY,
float _elementSpacingZ,
MET_ValueEnumType _elementType,
int _elementNumberOfChannels=1,
void *_elementData=NULL);
~MetaImage(void);
virtual void PrintInfo(void) const;
virtual void CopyInfo(const MetaObject * _object);
virtual void Clear(void);
bool InitializeEssential(int _nDims,
const int * _dimSize,
const float * _elementSpacing,
MET_ValueEnumType _elementType,
int _elementNumberOfChannels=1,
void *_elementData=NULL,
bool _allocElementMemory=true);
//
//
//
int HeaderSize(void) const;
void HeaderSize(int _headerSize);
MET_ImageModalityEnumType Modality(void) const;
void Modality(MET_ImageModalityEnumType _modality);
// DimSize(...)
// REQUIRED Field
// Number of elements along each dimension
const int * DimSize(void) const;
int DimSize(int _i) const;
//void DimSize(const int * _dimSize);
//void DimSize(int _i, int _value);
// Quantity()
// Not a field in file
// Total number of elements in image (Prod(dimSize[i]))
METAIO_STL::streamoff Quantity(void) const;
// SubQuantity(...)
// Not a field in file
// Number of elements in image spanning sub-dimensions
// E.g., elements per line, 2D sub-image, 3D sub-volume,
const METAIO_STL::streamoff * SubQuantity(void) const;
METAIO_STL::streamoff SubQuantity(int _i) const;
// SequenceID(...)
// Optional Field
// DICOM designation of this image relative to other images
// acquired at the same time
const float * SequenceID(void) const;
float SequenceID(int _i) const;
void SequenceID(const float * _sequenceID);
void SequenceID(int _i, float _value);
// ElemSize(...)
// Optional Field
// Physical size (in MM) of each element in the image
// (0 = xSize, 1 = ySize, 2 = zSize)
bool ElementSizeValid(void) const;
void ElementSizeValid(bool _elementSizeValid);
const float * ElementSize(void) const;
float ElementSize(int i) const;
void ElementSize(const float * _pointSize);
void ElementSize(int _i, float _value);
MET_ValueEnumType ElementType(void) const;
void ElementType(MET_ValueEnumType _elementType);
int ElementNumberOfChannels(void) const;
void ElementNumberOfChannels(int _elementNumberOfChannels);
// ElemMakeByteOrderMSB(), ElemMakeByteOrderLSB(),
// ElemByteOrderSwap(), ElemByteOrderFix()
// The following functions are available only after
// ReadImageData() or if _read_and_close=TRUE when read
//
// if streaming is used, then the size of buffer in total number
// of elements, should be passed as an argument, otherwise the
// internal value Quantity() will be used
void ElementByteOrderSwap( METAIO_STL::streamoff _quantity = 0);
bool ElementByteOrderFix( METAIO_STL::streamoff _quantity = 0);
// Min(...) Max(...)
// The default max returned is the largest allowed by
// ElemNBytes (12 bit uint16_t will give 4096 max).
// This may not represent the true max. Use _reCalc=true
// to force a calcuation of the actual max element value.
bool ElementMinMaxValid(void) const;
void ElementMinMaxValid(bool _elementMinMaxValid);
void ElementMinMaxRecalc(void);
double ElementMin(void) const;
void ElementMin(double _elementMin);
double ElementMax(void) const;
void ElementMax(double _elementMax);
//
//
//
double ElementToIntensityFunctionSlope(void) const;
void ElementToIntensityFunctionSlope(double _slope);
double ElementToIntensityFunctionOffset(void) const;
void ElementToIntensityFunctionOffset(double _offset);
//
//
//
bool AutoFreeElementData(void) const;
void AutoFreeElementData(bool _freeData);
//
//
//
const char * ElementDataFileName(void) const;
void ElementDataFileName(const char * _dataFileName);
//
//
//
void * ElementData(void);
double ElementData(METAIO_STL::streamoff _i) const;
bool ElementData(METAIO_STL::streamoff _i, double _v);
void ElementData(void * _data, bool _autoFreeElementData=false);
// ConverTo(...)
// Converts to a new data type
// Rescales using Min and Max (see above)
bool ConvertElementDataTo(MET_ValueEnumType _elementType=MET_USHORT,
double _toMin=0, double _toMax=0);
bool ConvertElementDataToIntensityData( MET_ValueEnumType
_intensityType=MET_SHORT);
bool ConvertIntensityDataToElementData( MET_ValueEnumType
_elementType=MET_USHORT);
//
//
//
bool CanRead(const char *_headerName=NULL) const;
bool Read(const char *_headerName=NULL,
bool _readElements=true,
void * _buffer=NULL);
bool ReadROI(int * _indexMin, int * _indexMax,
const char *_headerName=NULL,
bool _readElements=true,
void * _buffer=NULL,
unsigned int subSamplingFactor=1
);
bool CanReadStream(METAIO_STREAM::ifstream * _stream) const;
bool ReadStream(int _nDims,
METAIO_STREAM::ifstream * _stream,
bool _readElements=true,
void * _buffer=NULL);
bool ReadROIStream(int * _indexMin, int * _indexMax,
int _nDims,
METAIO_STREAM::ifstream * _stream,
bool _readElements=true,
void * _buffer=NULL,
unsigned int subSamplingFactor=1);
bool Write(const char *_headName=NULL,
const char *_dataName=NULL,
bool _writeElements=true,
const void * _constElementData=NULL,
bool _append=false);
bool WriteROI(int * _indexMin, int * _indexMax,
const char *_headName=NULL,
const char *_dataName=NULL,
bool _writeElements=true,
const void * _constElementData=NULL,
bool _append=false
);
bool WriteStream(METAIO_STREAM::ofstream * _stream,
bool _writeElements=true,
const void * _constElementData=NULL);
bool Append(const char *_headName=NULL);
typedef METAIO_STL::pair<long,long> CompressionOffsetType;
////
//
// PROTECTED
//
////
protected:
MET_ImageModalityEnumType m_Modality;
MET_CompressionTableType* m_CompressionTable;
int m_DimSize[10];
METAIO_STL::streamoff m_SubQuantity[10];
METAIO_STL::streamoff m_Quantity;
int m_HeaderSize;
float m_SequenceID[4];
bool m_ElementSizeValid;
float m_ElementSize[10];
MET_ValueEnumType m_ElementType;
int m_ElementNumberOfChannels;
bool m_ElementMinMaxValid;
double m_ElementMin;
double m_ElementMax;
double m_ElementToIntensityFunctionSlope;
double m_ElementToIntensityFunctionOffset;
bool m_AutoFreeElementData;
void * m_ElementData;
char m_ElementDataFileName[255];
virtual void M_Destroy(void);
virtual void M_SetupReadFields(void);
virtual void M_SetupWriteFields(void);
virtual bool M_Read(void);
// _dataQuantity is expressed in number of pixels. Internally it will be
// scaled by the number of components and number of bytes per component.
bool M_ReadElements(METAIO_STREAM::ifstream * _fstream,
void * _data,
METAIO_STL::streamoff _dataQuantity);
// _totalDataQuantity and _dataQuantity are expressed in number of pixels.
// Internally they will be scaled by the number of components and number of
// bytes per component.
bool M_ReadElementsROI(METAIO_STREAM::ifstream * _fstream,
void * _data,
METAIO_STL::streamoff _dataQuantity,
int * _indexMin,
int* _indexMax,
unsigned int subSamplingFactor=1,
METAIO_STL::streamoff _totalDataQuantity=0);
bool M_ReadElementData(METAIO_STREAM::ifstream * _fstream,
void * _data,
METAIO_STL::streamoff _dataQuantity);
bool M_WriteElements(METAIO_STREAM::ofstream * _fstream,
const void * _data,
METAIO_STL::streamoff _dataQuantity);
bool M_WriteElementsROI(METAIO_STREAM::ofstream * _fstream,
const void * _data,
METAIO_STL::streampos _dataPos,
int * _indexMin,
int* _indexMax);
bool M_WriteElementData(METAIO_STREAM::ofstream * _fstream,
const void * _data,
METAIO_STL::streamoff _dataQuantity);
bool M_FileExists(const char* filename) const;
bool FileIsFullPath(const char* in_name) const;
METAIO_STL::string M_GetTagValue(const METAIO_STL::string & buffer,
const char* tag) const;
};
#if (METAIO_USE_NAMESPACE)
};
#endif
#endif