DYT/Tool/3rdParty_x64/include/dcmtk/dcmimgle/didocu.h
2024-11-22 23:19:31 +08:00

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