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.

246 lines
6.2 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkDICOMImageReader.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
/**
* @class vtkDICOMImageReader
* @brief Reads some DICOM images
*
* DICOM (stands for Digital Imaging in COmmunications and Medicine)
* is a medical image file format widely used to exchange data, provided
* by various modalities.
* @warning
* This reader might eventually handle ACR-NEMA file (predecessor of the DICOM
* format for medical images).
* This reader does not handle encapsulated format, only plain raw file are
* handled. This reader also does not handle multi-frames DICOM datasets.
* @warning
* Internally DICOMParser assumes the x,y pixel spacing is stored in 0028,0030 and
* that z spacing is stored in Slice Thickness (correct only when slice were acquired
* contiguous): 0018,0050. Which means this is only valid for some rare
* MR Image Storage
*
* @sa
* vtkBMPReader vtkPNMReader vtkTIFFReader
*/
#ifndef vtkDICOMImageReader_h
#define vtkDICOMImageReader_h
#include "vtkIOImageModule.h" // For export macro
#include "vtkImageReader2.h"
class vtkDICOMImageReaderVector;
class DICOMParser;
class DICOMAppHelper;
class VTKIOIMAGE_EXPORT vtkDICOMImageReader : public vtkImageReader2
{
public:
//@{
/**
* Static method for construction.
*/
static vtkDICOMImageReader* New();
vtkTypeMacro(vtkDICOMImageReader, vtkImageReader2);
//@}
/**
* Prints the ivars.
*/
void PrintSelf(ostream& os, vtkIndent indent) override;
//@{
/**
* Set the filename for the file to read. If this method is used,
* the reader will only read a single file.
*/
void SetFileName(const char* fn) override
{
delete[] this->DirectoryName;
delete[] this->FileName;
this->DirectoryName = nullptr;
this->FileName = nullptr;
this->vtkImageReader2::SetFileName(fn);
}
//@}
/**
* Set the directory name for the reader to look in for DICOM
* files. If this method is used, the reader will try to find
* all the DICOM files in a directory. It will select the subset
* corresponding to the first series UID it stumbles across and
* it will try to build an ordered volume from them based on
* the slice number. The volume building will be upgraded to
* something more sophisticated in the future.
*/
void SetDirectoryName(const char* dn);
//@{
/**
* Returns the directory name.
*/
vtkGetStringMacro(DirectoryName);
//@}
/**
* Returns the pixel spacing (in X, Y, Z).
* Note: if there is only one slice, the Z spacing is set to the slice
* thickness. If there is more than one slice, it is set to the distance
* between the first two slices.
*/
double* GetPixelSpacing() VTK_SIZEHINT(3);
/**
* Returns the image width.
*/
int GetWidth();
/**
* Returns the image height.
*/
int GetHeight();
/**
* Get the (DICOM) x,y,z coordinates of the first pixel in the
* image (upper left hand corner) of the last image processed by the
* DICOMParser
*/
float* GetImagePositionPatient() VTK_SIZEHINT(3);
/**
* Get the (DICOM) directions cosines. It consist of the components
* of the first two vectors. The third vector needs to be computed
* to form an orthonormal basis.
*/
float* GetImageOrientationPatient() VTK_SIZEHINT(6);
/**
* Get the number of bits allocated for each pixel in the file.
*/
int GetBitsAllocated();
/**
* Get the pixel representation of the last image processed by the
* DICOMParser. A zero is a unsigned quantity. A one indicates a
* signed quantity
*/
int GetPixelRepresentation();
/**
* Get the number of components of the image data for the last
* image processed.
*/
int GetNumberOfComponents();
/**
* Get the transfer syntax UID for the last image processed.
*/
const char* GetTransferSyntaxUID();
/**
* Get the rescale slope for the pixel data.
*/
float GetRescaleSlope();
/**
* Get the rescale offset for the pixel data.
*/
float GetRescaleOffset();
/**
* Get the patient name for the last image processed.
*/
const char* GetPatientName();
/**
* Get the study uid for the last image processed.
*/
const char* GetStudyUID();
/**
* Get the Study ID for the last image processed.
*/
const char* GetStudyID();
/**
* Get the gantry angle for the last image processed.
*/
float GetGantryAngle();
//
// Can I read the file?
//
int CanReadFile(const char* fname) override;
//
// What file extensions are supported?
//
const char* GetFileExtensions() override { return ".dcm"; }
/**
* Return a descriptive name for the file format that might be useful in a GUI.
*/
const char* GetDescriptiveName() override { return "DICOM"; }
protected:
//
// Setup the volume size
//
void SetupOutputInformation(int num_slices);
void ExecuteInformation() override;
void ExecuteDataWithInformation(vtkDataObject* out, vtkInformation* outInfo) override;
//
// Constructor
//
vtkDICOMImageReader();
//
// Destructor
//
~vtkDICOMImageReader() override;
//
// Instance of the parser used to parse the file.
//
DICOMParser* Parser;
//
// Instance of the callbacks that get the data from the file.
//
DICOMAppHelper* AppHelper;
//
// vtkDICOMImageReaderVector wants to be a PIMPL and it will be, but not quite yet.
//
vtkDICOMImageReaderVector* DICOMFileNames;
char* DirectoryName;
char* PatientName;
char* StudyUID;
char* StudyID;
char* TransferSyntaxUID;
// DICOMFileNames accessor methods for subclasses:
int GetNumberOfDICOMFileNames();
const char* GetDICOMFileName(int index);
private:
vtkDICOMImageReader(const vtkDICOMImageReader&) = delete;
void operator=(const vtkDICOMImageReader&) = delete;
};
#endif