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

346 lines
17 KiB
C++

/*
*
* Copyright (C) 1994-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: dcmdata
*
* Author: Gerd Ehlers, Andreas Barth
*
* Purpose: Interface of the class DcmDataset
*
*/
#ifndef DCDATSET_H
#define DCDATSET_H
#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
#include "dcmtk/dcmdata/dcitem.h"
// forward declarations
class DcmInputStream;
class DcmOutputStream;
class DcmRepresentationParameter;
/** a class handling the DICOM dataset format (files without meta header)
*/
class DCMTK_DCMDATA_EXPORT DcmDataset
: public DcmItem
{
public:
/** default constructor
*/
DcmDataset();
/** copy constructor
* @param old dataset to be copied
*/
DcmDataset(const DcmDataset &old);
/** destructor
*/
virtual ~DcmDataset();
/** assignment operator
* @param obj the dataset to be copied
*/
DcmDataset& operator=(const DcmDataset& obj);
/** clone method
* @return deep copy of this object
*/
virtual DcmObject *clone() const
{
return new DcmDataset(*this);
}
/** Virtual object copying. This method can be used for DcmObject
* and derived classes to get a deep copy of an object. Internally
* the assignment operator is called if the given DcmObject parameter
* is of the same type as "this" object instance. If not, an error
* is returned. This function permits copying an object by value
* in a virtual way which therefore is different to just calling the
* assignment operator of DcmElement which could result in slicing
* the object.
* @param rhs - [in] The instance to copy from. Has to be of the same
* class type as "this" object
* @return EC_Normal if copying was successful, error otherwise
*/
virtual OFCondition copyFrom(const DcmObject& rhs);
/** get type identifier
* @return type identifier of this class (EVR_dataset)
*/
virtual DcmEVR ident() const;
/** clear (remove) attribute value
* @return EC_Normal if successful, an error code otherwise
*/
virtual OFCondition clear();
/** remove all elements with an invalid group number, i.e. 0x0000 to 0x0003,
* 0x0005, 0x0007 and 0xFFFF in case of a data set. For sequence items, also
* group 0x0006 is disallowed. For command sets, only group 0x0000 is allowed,
* i.e. the elements from all other groups are removed.
* @param cmdSet specifies whether this object represents a command or data set
*/
virtual void removeInvalidGroups(const OFBool cmdSet = OFFalse);
/** return the transfer syntax in which this dataset was originally read or created.
* See updateOriginalXfer() on how to update this value when created in memory.
* @return transfer syntax in which this dataset was originally read. Might be
* EXS_Unknown if the dataset was created in memory.
*/
E_TransferSyntax getOriginalXfer() const;
/** return the current transfer syntax, i.e.\ the one that was last used with
* chooseRepresentation() in order to select a specific representation or with write()
* or writeSignatureFormat() in order to create a byte stream according to the DICOM
* encoding rules. The default value is the transfer syntax in which this dataset was
* originally read (see getOriginalXfer()) or, if this dataset was created from memory,
* the explicit VR with local endianness.
* Please note that the current transfer syntax might also change after calling
* updateOriginalXfer().
* @return transfer syntax in which this dataset is currently stored (see above)
*/
E_TransferSyntax getCurrentXfer() const;
/** update the original transfer syntax, e.g.\ in case the dataset was created in memory
* and pixel data was added with a particular representation. Icon images and other
* nested pixel data elements are not checked. If previously unknown, the original
* transfer syntax is set to the default EXS_LittleEndianExplicit. Please note that the
* current transfer syntax might also be updated if its value was not in sync with the
* internal representation of the pixel data.
*/
virtual void updateOriginalXfer();
/** print all elements of the dataset to a stream
* @param out output stream
* @param flags optional flag used to customize the output (see DCMTypes::PF_xxx)
* @param level current level of nested items. Used for indentation.
* @param pixelFileName optional filename used to write the raw pixel data file
* @param pixelCounter optional counter used for automatic pixel data filename creation
*/
virtual void print(STD_NAMESPACE ostream &out,
const size_t flags = 0,
const int level = 0,
const char *pixelFileName = NULL,
size_t *pixelCounter = NULL);
/** calculate the length of this DICOM element when encoded with the
* given transfer syntax and the given encoding type for sequences.
* For elements, the length includes the length of the tag, length field,
* VR field and the value itself, for items and sequences it returns
* the length of the complete item or sequence including delimitation tags
* if applicable. Never returns undefined length.
* @param xfer transfer syntax for length calculation
* @param enctype sequence encoding type for length calculation
* @return length of DICOM element
*/
Uint32 calcElementLength(const E_TransferSyntax xfer,
const E_EncodingType enctype);
/** check if this DICOM object can be encoded in the given transfer syntax.
* @param newXfer transfer syntax in which the DICOM object is to be encoded
* @param oldXfer transfer syntax in which the DICOM object was read or created
* (optional). If EXS_Unknown, the return value of getOriginalXfer() is used.
* @return true if object can be encoded in desired transfer syntax, false otherwise.
*/
virtual OFBool canWriteXfer(const E_TransferSyntax newXfer,
const E_TransferSyntax oldXfer = EXS_Unknown);
/** This function reads the information of all attributes which
* are captured in the input stream and captures this information
* in this->elementList. Each attribute is represented as an
* element in this list. Having read all information for this
* particular data set or command, this function will also take
* care of group length (according to what is specified in glenc)
* and padding elements (don't change anything).
* @param inStream The stream which contains the information.
* @param xfer The transfer syntax which was used to encode
* the information in inStream.
* @param glenc Encoding type for group length; specifies what
* will be done with group length tags.
* @param maxReadLength Maximum read length for reading an attribute value.
* @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition read(DcmInputStream &inStream,
const E_TransferSyntax xfer = EXS_Unknown,
const E_GrpLenEncoding glenc = EGL_noChange,
const Uint32 maxReadLength = DCM_MaxReadLength);
/** write dataset to a stream
* @param outStream DICOM output stream
* @param oxfer output transfer syntax (EXS_Unknown means use original)
* @param enctype encoding types (undefined or explicit length)
* @param wcache pointer to write cache object, may be NULL
* @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition write(DcmOutputStream &outStream,
const E_TransferSyntax oxfer,
const E_EncodingType enctype,
DcmWriteCache *wcache);
/** This function writes data values which are contained in this
* DcmDataset object to the stream which is passed as first argument.
* With regard to the writing of information, the other parameters
* which are passed are accounted for. The function will return
* EC_Normal, if the information from all elements of this data
* set has been written to the buffer, it will return EC_StreamNotifyClient,
* if there is no more space in the buffer and _not_ all elements
* have been written to it, and it will return some other (error)
* value if there was an error.
* @param outStream The stream that the information will be written to.
* @param oxfer The transfer syntax which shall be used (EXS_Unknown
* means use original).
* @param enctype Encoding type for sequences; specifies how sequences
* will be handled.
* @param wcache pointer to write cache object, may be NULL
* @param glenc Encoding type for group length; specifies what will
* be done with group length tags.
* @param padenc Encoding type for padding. Specifies what will be done
* with padding tags.
* @param padlen The length up to which the dataset shall be padded, if
* padding is desired.
* @param subPadlen For sequences (ie sub elements), the length up to which
* item shall be padded, if padding is desired.
* @param instanceLength Number of extra bytes added to the item/dataset length
* used when computing the padding; this parameter is for
* instance used to pass the length of the file meta header
* from the DcmFileFormat to the DcmDataset object.
* @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition write(DcmOutputStream &outStream,
const E_TransferSyntax oxfer,
const E_EncodingType enctype,
DcmWriteCache *wcache,
const E_GrpLenEncoding glenc,
const E_PaddingEncoding padenc = EPD_noChange,
const Uint32 padlen = 0,
const Uint32 subPadlen = 0,
Uint32 instanceLength = 0);
/** special write method for creation of digital signatures
* @param outStream DICOM output stream
* @param oxfer output transfer syntax (EXS_Unknown means use original)
* @param enctype encoding types (undefined or explicit length)
* @param wcache pointer to write cache object, may be NULL
* @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition writeSignatureFormat(DcmOutputStream &outStream,
const E_TransferSyntax oxfer,
const E_EncodingType enctype,
DcmWriteCache *wcache);
/** write object in XML format.
* The XML declaration (e.g. <?xml version="1.0"?>) is not written by this function.
* @param out output stream to which the XML document is written
* @param flags optional flag used to customize the output (see DCMTypes::XF_xxx)
* @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition writeXML(STD_NAMESPACE ostream &out,
const size_t flags = 0);
/** load object from a DICOM file.
* This method only supports DICOM objects stored as a dataset, i.e. without meta header.
* Use DcmFileFormat::loadFile() to load files with meta header.
* @param fileName name of the file to load (may contain wide chars if support enabled).
* Since there are various constructors for the OFFilename class, a "char *", "OFString"
* or "wchar_t *" can also be passed directly to this parameter.
* @param readXfer transfer syntax used to read the data (auto detection if EXS_Unknown)
* @param groupLength flag, specifying how to handle the group length tags
* @param maxReadLength maximum number of bytes to be read for an element value.
* Element values with a larger size are not loaded until their value is retrieved
* (with getXXX()) or loadAllDataIntoMemory() is called.
* @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition loadFile(const OFFilename &fileName,
const E_TransferSyntax readXfer = EXS_Unknown,
const E_GrpLenEncoding groupLength = EGL_noChange,
const Uint32 maxReadLength = DCM_MaxReadLength);
/** save object to a DICOM file.
* This method only supports DICOM objects stored as a dataset, i.e. without meta header.
* Use DcmFileFormat::saveFile() to save files with meta header.
* @param fileName name of the file to save (may contain wide chars if support enabled).
* Since there are various constructors for the OFFilename class, a "char *", "OFString"
* or "wchar_t *" can also be passed directly to this parameter.
* @param writeXfer transfer syntax used to write the data (EXS_Unknown means use original)
* @param encodingType flag, specifying the encoding with undefined or explicit length
* @param groupLength flag, specifying how to handle the group length tags
* @param padEncoding flag, specifying how to handle the padding tags
* @param padLength number of bytes used for the dataset padding (has to be an even number)
* @param subPadLength number of bytes used for the item padding (has to be an even number)
* @return status, EC_Normal if successful, an error code otherwise
*/
virtual OFCondition saveFile(const OFFilename &fileName,
const E_TransferSyntax writeXfer = EXS_Unknown,
const E_EncodingType encodingType = EET_UndefinedLength,
const E_GrpLenEncoding groupLength = EGL_recalcGL,
const E_PaddingEncoding padEncoding = EPD_noChange,
const Uint32 padLength = 0,
const Uint32 subPadLength = 0);
// methods for different pixel representations
/** select a specific representation (compressed or uncompressed) of the dataset
* and create the representation if needed. This may cause compression or decompression
* to be applied to the pixel data in the dataset.
* @param repType desired transfer syntax
* @param repParam desired representation parameter (e.g. quality factor for lossy compression)
* @return EC_Normal upon success, an error code otherwise.
*/
OFCondition chooseRepresentation(const E_TransferSyntax repType,
const DcmRepresentationParameter *repParam);
/** check if all PixelData elements in this dataset have a representation conforming
* to the given transfer syntax and representation parameters (see dcpixel.h for
* definition of "conforming").
* @param repType desired transfer syntax
* @param repParam desired representation parameter (e.g. quality factor for lossy compression)
* @return true if all pixel elements have the desired representation, false otherwise
*/
OFBool hasRepresentation(const E_TransferSyntax repType,
const DcmRepresentationParameter *repParam);
/** removes all but the original representation in all pixel data elements
*/
void removeAllButOriginalRepresentations();
/** removes all but the current representation and sets the original
* representation to current
*/
void removeAllButCurrentRepresentations();
/** mode specifying whether the SpecificCharacterSet (0008,0005) element should be
* checked by convertCharacterSet() or not, i.e.\ whether this element might be
* present on this dataset-level.
* @return always returns OFTrue, i.e.\ SpecificCharacterSet should be checked
*/
virtual OFBool checkForSpecificCharacterSet() const { return OFTrue; }
private:
/// original transfer syntax of the dataset
E_TransferSyntax OriginalXfer;
/// current transfer syntax of the dataset
E_TransferSyntax CurrentXfer;
};
#endif // DCDATSET_H