425 lines
14 KiB
C++
425 lines
14 KiB
C++
/*
|
|
*
|
|
* Copyright (C) 1996-2014, OFFIS e.V.
|
|
* All rights reserved. See COPYRIGHT file for details.
|
|
*
|
|
* This software and supporting documentation were developed by
|
|
*
|
|
* OFFIS e.V.
|
|
* R&D Division Health
|
|
* Escherweg 2
|
|
* D-26121 Oldenburg, Germany
|
|
*
|
|
*
|
|
* Module: dcmimgle
|
|
*
|
|
* Author: Joerg Riesmeier
|
|
*
|
|
* Purpose: DicomDocument (Header)
|
|
*
|
|
*/
|
|
|
|
|
|
#ifndef DIDOCU_H
|
|
#define DIDOCU_H
|
|
|
|
#include "dcmtk/config/osconfig.h"
|
|
|
|
#include "dcmtk/dcmdata/dctypes.h"
|
|
#include "dcmtk/dcmdata/dcfilefo.h"
|
|
#include "dcmtk/dcmdata/dcxfer.h"
|
|
#include "dcmtk/dcmimgle/diobjcou.h"
|
|
#include "dcmtk/ofstd/ofstring.h"
|
|
|
|
#define INCLUDE_CSTDDEF
|
|
#include "dcmtk/ofstd/ofstdinc.h"
|
|
|
|
|
|
/*------------------------*
|
|
* forward declarations *
|
|
*------------------------*/
|
|
|
|
class DcmStack;
|
|
class DcmObject;
|
|
class DcmTagKey;
|
|
class DcmElement;
|
|
class DcmPixelData;
|
|
class DcmSequenceOfItems;
|
|
|
|
|
|
/*---------------------*
|
|
* class declaration *
|
|
*---------------------*/
|
|
|
|
/** Interface class to DICOM data management (dcmdata).
|
|
* NB: This is an internal class of module dcmimgle/dcmimage. Please do not
|
|
* use it for accessing DICOM data structures. Instead use the classes
|
|
* and functions provided by dcmdata (e.g. class DcmFileFormat, DcmItem).
|
|
*/
|
|
class DCMTK_DCMIMGLE_EXPORT DiDocument
|
|
: public DiObjectCounter
|
|
{
|
|
|
|
public:
|
|
|
|
/** constructor, open a DICOM file
|
|
*
|
|
** @param filename the DICOM file
|
|
* @param flags configuration flags (only stored for later use)
|
|
* @param fstart first frame to be processed (only stored for later use)
|
|
* @param fcount number of frames (only stored for later use)
|
|
*/
|
|
DiDocument(const char *filename,
|
|
const unsigned long flags = 0,
|
|
const unsigned long fstart = 0,
|
|
const unsigned long fcount = 0);
|
|
|
|
/** constructor, use a given DcmObject
|
|
*
|
|
** @param object pointer to DICOM data structures (fileformat, dataset or item)
|
|
* @param xfer transfer syntax of the 'object'.
|
|
* (could also be EXS_Unknown in case of fileformat or dataset)
|
|
* @param flags configuration flags (only stored for later use)
|
|
* @param fstart first frame to be processed (only stored for later use)
|
|
* @param fcount number of frames (only stored for later use)
|
|
*/
|
|
DiDocument(DcmObject *object,
|
|
const E_TransferSyntax xfer,
|
|
const unsigned long flags = 0,
|
|
const unsigned long fstart = 0,
|
|
const unsigned long fcount = 0);
|
|
|
|
/** destructor
|
|
*/
|
|
virtual ~DiDocument();
|
|
|
|
/** check whether current document is valid
|
|
*
|
|
** @return status, true if successful, false otherwise
|
|
*/
|
|
inline int good() const
|
|
{
|
|
return Object != NULL;
|
|
}
|
|
|
|
/** get current DICOM object (dataset)
|
|
*
|
|
** @return pointer to DICOM object
|
|
*/
|
|
inline DcmObject *getDicomObject() const
|
|
{
|
|
return Object;
|
|
}
|
|
|
|
/** get current DICOM dataset
|
|
*
|
|
** @return pointer to DICOM dataset
|
|
*/
|
|
inline DcmDataset *getDataset() const
|
|
{
|
|
return OFstatic_cast(DcmDataset *, Object);
|
|
}
|
|
|
|
/** get first frame to be processed
|
|
*
|
|
** @return first frame to be processed
|
|
*/
|
|
inline unsigned long getFrameStart() const
|
|
{
|
|
return FrameStart;
|
|
}
|
|
|
|
/** get number of frames to be processed
|
|
*
|
|
** @return number of frames to be processed
|
|
*/
|
|
inline unsigned long getFrameCount() const
|
|
{
|
|
return FrameCount;
|
|
}
|
|
|
|
/** get configuration flags
|
|
*
|
|
** @return configuration flags
|
|
*/
|
|
inline unsigned long getFlags() const
|
|
{
|
|
return Flags;
|
|
}
|
|
|
|
/** get transfer syntax of the DICOM dataset
|
|
*
|
|
** @return transfer syntax
|
|
*/
|
|
inline E_TransferSyntax getTransferSyntax() const
|
|
{
|
|
return Xfer;
|
|
}
|
|
|
|
/** get photometric interpretation (color model).
|
|
* Please note that this is the color model of the decompressed image which might
|
|
* deviate from the color model of the original compressed image.
|
|
*
|
|
** @return photometric interpretation of the DICOM object
|
|
*/
|
|
inline const char *getPhotometricInterpretation() const
|
|
{
|
|
return PhotometricInterpretation.c_str();
|
|
}
|
|
|
|
/** get pixel data object
|
|
*
|
|
** @return reference to pixel data object (might be NULL)
|
|
*/
|
|
inline DcmPixelData *getPixelData() const
|
|
{
|
|
return PixelData;
|
|
}
|
|
|
|
/** check whether pixel data only exist in compressed format
|
|
*
|
|
** @return true if pixel data is compressed, false if an uncompressed version exists
|
|
*/
|
|
inline OFBool isCompressed() const
|
|
{
|
|
return DcmXfer(Xfer).isEncapsulated();
|
|
}
|
|
|
|
/** search for given tag
|
|
*
|
|
** @param tag tag to search for
|
|
* @param obj element in the dataset where the search should start (default: root)
|
|
*
|
|
** @return pointer to element if successful, NULL otherwise
|
|
*/
|
|
DcmElement *search(const DcmTagKey &tag,
|
|
DcmObject *obj = NULL) const;
|
|
|
|
/** search for given tag and put result(s) on a stack
|
|
*
|
|
** @param tag tag to search for
|
|
* @param stack stack where the result(s) should be stored
|
|
*
|
|
** @return status, true if successful, false otherwise
|
|
*/
|
|
int search(const DcmTagKey &tag,
|
|
DcmStack &stack) const;
|
|
|
|
|
|
/** get value multiplicity (VM) of given tag
|
|
*
|
|
** @param tag tag to be searched
|
|
*
|
|
** @return VM if successful, 0 otherwise
|
|
*/
|
|
unsigned long getVM(const DcmTagKey &tag) const;
|
|
|
|
/** get value of given tag (Uint16)
|
|
*
|
|
** @param tag tag to search for
|
|
* @param returnVal reference to the storage area for the resulting value
|
|
* @param pos position in multi-valued elements (starting with 0)
|
|
* @param item pointer to item in dataset where to start (default: main dataset)
|
|
* @param allowSigned also allow signed value (Sint16) if true
|
|
*
|
|
** @return VM if successful, 0 otherwise
|
|
*/
|
|
unsigned long getValue(const DcmTagKey &tag,
|
|
Uint16 &returnVal,
|
|
const unsigned long pos = 0,
|
|
DcmItem *item = NULL,
|
|
const OFBool allowSigned = OFFalse) const;
|
|
|
|
/** get value of given tag (Sint16)
|
|
*
|
|
** @param tag tag to search for
|
|
* @param returnVal reference to the storage area for the resulting value
|
|
* @param pos position in multi-valued elements (starting with 0)
|
|
* @param item pointer to item in dataset where to start (default: main dataset)
|
|
*
|
|
** @return VM if successful, 0 otherwise
|
|
*/
|
|
unsigned long getValue(const DcmTagKey &tag,
|
|
Sint16 &returnVal,
|
|
const unsigned long pos = 0,
|
|
DcmItem *item = NULL) const;
|
|
|
|
/** get value of given tag (Uint32)
|
|
*
|
|
** @param tag tag to search for
|
|
* @param returnVal reference to the storage area for the resulting value
|
|
* @param pos position in multi-valued elements (starting with 0)
|
|
* @param item pointer to item in dataset where to start (default: main dataset)
|
|
*
|
|
** @return VM if successful, 0 otherwise
|
|
*/
|
|
unsigned long getValue(const DcmTagKey &tag,
|
|
Uint32 &returnVal,
|
|
const unsigned long pos = 0,
|
|
DcmItem *item = NULL) const;
|
|
|
|
/** get value of given tag (Sint32)
|
|
*
|
|
** @param tag tag to search for
|
|
* @param returnVal reference to the storage area for the resulting value
|
|
* @param pos position in multi-valued elements (starting with 0)
|
|
* @param item pointer to item in dataset where to start (default: main dataset)
|
|
*
|
|
** @return VM if successful, 0 otherwise
|
|
*/
|
|
unsigned long getValue(const DcmTagKey &tag,
|
|
Sint32 &returnVal,
|
|
const unsigned long pos = 0,
|
|
DcmItem *item = NULL) const;
|
|
|
|
/** get value of given tag (double)
|
|
*
|
|
** @param tag tag to search for
|
|
* @param returnVal reference to the storage area for the resulting value
|
|
* @param pos position in multi-valued elements (starting with 0)
|
|
* @param item pointer to item in dataset where to start (default: main dataset)
|
|
*
|
|
** @return VM if successful, 0 otherwise
|
|
*/
|
|
unsigned long getValue(const DcmTagKey &tag,
|
|
double &returnVal,
|
|
const unsigned long pos = 0,
|
|
DcmItem *item = NULL) const;
|
|
|
|
/** get value of given tag (Uint16 array)
|
|
*
|
|
** @param tag tag to search for
|
|
* @param returnVal reference to the storage area for the resulting value
|
|
* @param item pointer to item in dataset where to start (default: main dataset)
|
|
*
|
|
** @return VM / number of values if successful, 0 otherwise
|
|
*/
|
|
unsigned long getValue(const DcmTagKey &tag,
|
|
const Uint16 *&returnVal,
|
|
DcmItem *item = NULL) const;
|
|
|
|
/** get value of given tag (const char *)
|
|
*
|
|
** @param tag tag to search for
|
|
* @param returnVal reference to the storage area for the resulting value
|
|
* @param item pointer to item in dataset where to start (default: main dataset)
|
|
*
|
|
** @return VM if successful, 0 otherwise
|
|
*/
|
|
unsigned long getValue(const DcmTagKey &tag,
|
|
const char *&returnVal,
|
|
DcmItem *item = NULL) const;
|
|
|
|
/** get value of given tag (OFString)
|
|
*
|
|
** @param tag tag to search for
|
|
* @param returnVal reference to the storage area for the resulting value
|
|
* @param pos position in multi-valued elements (starting with 0)
|
|
* @param item pointer to item in dataset where to start (default: main dataset)
|
|
*
|
|
** @return VM if successful, 0 otherwise
|
|
*/
|
|
unsigned long getValue(const DcmTagKey &tag,
|
|
OFString &returnVal,
|
|
const unsigned long pos = 0,
|
|
DcmItem *item = NULL) const;
|
|
|
|
/** get sequence of given tag
|
|
*
|
|
** @param tag tag to search for
|
|
* @param seq reference to the storage area for the resulting value
|
|
* @param item pointer to item in dataset where to start (default: main dataset)
|
|
*
|
|
** @return cardinality if successful, 0 otherwise
|
|
*/
|
|
unsigned long getSequence(const DcmTagKey &tag,
|
|
DcmSequenceOfItems *&seq,
|
|
DcmItem *item = NULL) const;
|
|
|
|
// --- static helper functions ---
|
|
|
|
/** get value of given element (Uint16)
|
|
*
|
|
** @param elem element where the value is stored
|
|
* @param returnVal reference to the storage area for the resulting value
|
|
* @param pos position in multi-valued elements (starting with 0)
|
|
* @param allowSigned also allow signed value (Sint16) if true
|
|
*
|
|
** @return VM if successful, 0 otherwise
|
|
*/
|
|
static unsigned long getElemValue(const DcmElement *elem,
|
|
Uint16 &returnVal,
|
|
const unsigned long pos = 0,
|
|
const OFBool allowSigned = OFFalse);
|
|
|
|
/** get value of given element (Uint16 array)
|
|
*
|
|
** @param elem element where the value is stored
|
|
* @param returnVal reference to the storage area for the resulting value
|
|
*
|
|
** @return VM / number of values if successful, 0 otherwise
|
|
*/
|
|
static unsigned long getElemValue(const DcmElement *elem,
|
|
const Uint16 *&returnVal);
|
|
|
|
/** get value of given element (const char *)
|
|
*
|
|
** @param elem element where the value is stored
|
|
* @param returnVal reference to the storage area for the resulting value
|
|
*
|
|
** @return VM if successful, 0 otherwise
|
|
*/
|
|
static unsigned long getElemValue(const DcmElement *elem,
|
|
const char *&returnVal);
|
|
|
|
/** get value of given element (OFString)
|
|
*
|
|
** @param elem element where the value is stored
|
|
* @param returnVal reference to the storage area for the resulting value
|
|
* @param pos position in multi-valued elements (starting with 0)
|
|
*
|
|
** @return VM if successful, 0 otherwise
|
|
*/
|
|
static unsigned long getElemValue(const DcmElement *elem,
|
|
OFString &returnVal,
|
|
const unsigned long pos = 0);
|
|
|
|
|
|
protected:
|
|
|
|
/** convert pixel data to uncompressed representation (if required)
|
|
*/
|
|
void convertPixelData();
|
|
|
|
|
|
private:
|
|
|
|
/// reference to DICOM dataset (in memory)
|
|
DcmObject *Object;
|
|
/// reference to DICOM fileformat (read from file, maybe NULL)
|
|
DcmFileFormat *FileFormat;
|
|
/// reference to pixel data object
|
|
DcmPixelData *PixelData;
|
|
/// transfer syntax used for reading the dataset
|
|
E_TransferSyntax Xfer;
|
|
|
|
/// first frame to be processed
|
|
unsigned long FrameStart;
|
|
/// number of frames to be processed
|
|
unsigned long FrameCount;
|
|
|
|
/// configuration flags
|
|
unsigned long Flags;
|
|
|
|
/// photometric interpretation (color model)
|
|
OFString PhotometricInterpretation;
|
|
|
|
// --- declarations to avoid compiler warnings
|
|
|
|
DiDocument(const DiDocument &);
|
|
DiDocument &operator=(const DiDocument &);
|
|
};
|
|
|
|
|
|
#endif
|