DYT/Tool/3rdParty_x64/include/dcmtk/dcmimgle/dcmimage.h

1911 lines
86 KiB
C
Raw Normal View History

2024-11-22 15:19:31 +00:00
/*
*
* Copyright (C) 1996-2016, 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: Provides main interface to the "DICOM image toolkit"
*
*/
#ifndef DCMIMAGE_H
#define DCMIMAGE_H
#include "dcmtk/config/osconfig.h"
#include "dcmtk/ofstd/ofcast.h"
#include "dcmtk/dcmimgle/dimoimg.h"
#include "dcmtk/dcmimgle/didispfn.h"
#include "dcmtk/dcmimgle/diutils.h"
/*------------------------*
* forward declarations *
*------------------------*/
class DcmXfer;
class DcmObject;
class DcmOverlayData;
class DcmLongString;
class DcmUnsignedShort;
class DiPixel;
class DiDocument;
class DiPluginFormat;
/*---------------------*
* class declaration *
*---------------------*/
/** Interface class for dcmimgle/dcmimage module.
* The main purpose of these modules is image display.
*/
class DCMTK_DCMIMGLE_EXPORT DicomImage
{
public:
// --- constructors and destructor
/** constructor, open a DICOM file.
* Opens specified file and reads image related data, creates internal representation
* of image data. Use getStatus() to obtain detailed information about any errors.
*
** @param filename the DICOM file
* @param flags configuration flags (see diutils.h, CIF_MayDetachPixelData is set automatically)
* @param fstart first frame to be processed (optional, 0 = 1st frame), all subsequent use
* of parameters labeled 'frame' in this class refers to this start frame.
* @param fcount number of frames (optional, 0 = all frames)
*/
DicomImage(const char *filename,
const unsigned long flags = 0,
const unsigned long fstart = 0,
const unsigned long fcount = 0);
#ifndef STARVIEW
/** constructor, use a given DcmObject
*
** @param object pointer to DICOM data structures (fileformat, dataset or item).
* (do not delete while referenced, i.e. while this image object or any
* descendant exists; not deleted within dcmimage unless configuration flag
* CIF_TakeOverExternalDataset is set - in this case do not delete it at all)
* @param xfer transfer syntax of the 'object'.
* (could also be EXS_Unknown in case of fileformat or dataset)
* @param flags configuration flags (CIF_xxx, see diutils.h)
* @param fstart first frame to be processed (optional, 0 = 1st frame), all subsequent use
* of parameters labeled 'frame' in this class refers to this start frame.
* @param fcount number of frames (optional, 0 = all frames)
*/
DicomImage(DcmObject *object,
const E_TransferSyntax xfer,
const unsigned long flags = 0,
const unsigned long fstart = 0,
const unsigned long fcount = 0);
/** constructor, use a given DcmObject with specified rescale/slope.
* NB: This constructor ignores the Photometric Interpretation stored in the DICOM dataset
* and always creates a MONOCHROME2 image - useful in combination with Presentation States.
*
** @param object pointer to DICOM data structures (fileformat, dataset or item).
* (do not delete while referenced, i.e. while this image object or any
* descendant exists; not deleted within dcmimage unless configuration flag
* CIF_TakeOverExternalDataset is set - in this case do not delete it at all)
* @param xfer transfer syntax of the 'object'.
* (could also be EXS_Unknown in case of fileformat or dataset)
* @param slope rescale slope (modality transformation)
* @param intercept rescale intercept (modality transformation)
* @param flags configuration flags (CIF_xxx, see diutils.h)
* @param fstart first frame to be processed (optional, 0 = 1st frame), all subsequent use
* of parameters labeled 'frame' in this class refers to this start frame.
* @param fcount number of frames (optional, 0 = all frames)
*/
DicomImage(DcmObject *object,
const E_TransferSyntax xfer,
const double slope,
const double intercept,
const unsigned long flags = 0,
const unsigned long fstart = 0,
const unsigned long fcount = 0);
/** constructor, use a given DcmObject with specified modality LUT.
* NB: This constructor ignores the Photometric Interpretation stored in the DICOM dataset
* and always creates a MONOCHROME2 image - useful in combination with Presentation States.
*
** @param object pointer to DICOM data structures (fileformat, dataset or item).
* (do not delete while referenced, i.e. while this image object or any
* descendant exists; not deleted within dcmimage unless configuration flag
* CIF_TakeOverExternalDataset is set - in this case do not delete it at all)
* @param xfer transfer syntax of the 'object'.
* (could also be EXS_Unknown in case of fileformat or dataset)
* @param data dataset element containing modality LUT data
* @param descriptor dataset element containing modality LUT descriptor
* @param explanation dataset element containing modality LUT explanation
* @param flags configuration flags (CIF_xxx, see diutils.h)
* @param fstart first frame to be processed (optional, 0 = 1st frame), all subsequent use
* of parameters labeled 'frame' in this class refers to this start frame.
* @param fcount number of frames (optional, 0 = all frames)
*/
DicomImage(DcmObject *object,
E_TransferSyntax xfer,
const DcmUnsignedShort &data,
const DcmUnsignedShort &descriptor,
const DcmLongString *explanation = NULL,
const unsigned long flags = 0,
const unsigned long fstart = 0,
const unsigned long fcount = 0);
#endif
/** destructor
*/
virtual ~DicomImage();
// --- multi-frame handling
/** process next couple of frames. If the image object has been created with less than the number
* of frames stored in the DICOM image, this function allows for accessing the subsequent frames.
* Multiple calls to this function allow for successively processing all frames stored in the
* file or dataset. See parameters 'fstart' and 'fcount' of the constructor for how to initially
* create an instance of this class.
* NB: Only "original" images can be processed in this way, i.e. images that were created by one
* of the above constructors. Images that were created by one of the createXXX() methods can
* not be processed since they are derived from original image data in a certain way, e.g.
* scaled.
*
** @param fcount number of frames to be processed (0 = same number as before)
*
** @return status, true if successful, false otherwise
*/
inline int processNextFrames(const unsigned long fcount = 0)
{
return (Image != NULL) ?
Image->processNextFrames(fcount) : 0;
}
// --- information: return requested value if successful
/** convert status code to status string
*
** @param status code of current internal status
*
** @return pointer to status string
*/
static const char *getString(const EI_Status status);
/** convert photometric interpretation code to interpretation string (defined term)
*
** @param interpret code of image's photometric interpretation
*
** @return pointer to photometric interpretation string
*/
static const char *getString(const EP_Interpretation interpret);
/** get current status information
*
** @return status code
*/
inline EI_Status getStatus() const
{
return (Image != NULL) ?
Image->getStatus() : ImageStatus;
}
/** get number of frames.
* Please note that this function does not return the number of frames stored in the
* DICOM file/dataset (use getNumberOfFrames() instead). It rather refers to the
* number of frames processed by this class (see constructors for details).
*
** @return number of frames processed by this class
*/
inline unsigned long getFrameCount() const
{
return (Image != NULL) ?
Image->getNumberOfFrames() : 0;
}
/** get index of first frame.
* This functions returns the index of the first frame processed by this class (see
* constructors for details).
*
** @return index of first frame (0..n-1)
*/
inline unsigned long getFirstFrame() const
{
return (Image != NULL) ?
Image->getFirstFrame() : 0;
}
/** get number of frames stored in the DICOM file/dataset.
* This attribute is mandatory for DICOM images with multiple frames.
* For single frame images, the value defaults to 1.
*
** @return number of frames stored in the DICOM file/dataset
*/
inline unsigned long getNumberOfFrames() const
{
return (Image != NULL) ?
Image->getTotalNumberOfFrames() : 0;
}
/** get index of representative frame.
* This attribute is optionally stored in the DICOM dataset (type 3).
*
** @return index of representative frame (0..n-1)
*/
inline unsigned long getRepresentativeFrame() const
{
return (Image != NULL) ?
Image->getRepresentativeFrame() : 0;
}
/** get nominal time (in milliseconds) between individual frames.
* This attribute might not always be stored in the DICOM dataset.
*
** @return nominal time between individual frames, 0 if absent
*/
inline double getFrameTime() const
{
return (Image != NULL) ?
Image->getFrameTime() : 0;
}
/** get image width in pixels
*
** @return number of pixels in one row
*/
inline unsigned long getWidth() const
{
return (Image != NULL) ?
Image->getColumns() : 0;
}
/** get image height in pixels
*
** @return number of pixels in one column
*/
inline unsigned long getHeight() const
{
return (Image != NULL) ?
Image->getRows() : 0;
}
/** get image depth
*
** @return number of bits per sample of the internal representation
*/
inline int getDepth() const
{
return (Image != NULL) ?
Image->getBits() : 0;
}
/** get minimum and maximum pixel values.
* the resulting pixel values are stored in 'double' variables to avoid problems
* with different number ranges, limited to monochrome images.
* Please note that the min/max values refer to the full pixel data (i.e. including
* all possible present frames as specified in the constructor of this class).
*
** @param min minimum pixel value (reference parameter)
* @param max maximum pixel value (reference parameter)
* @param mode 0 = min/max 'used' pixel values,
* 1 = min/max 'possible' pixel values (absolute min/max)
*
** @return status code (true if successful)
*/
inline int getMinMaxValues(double &min,
double &max,
const int mode = 0) const
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->getMinMaxValues(min, max, mode) : 0;
}
/** get width height ratio (pixel aspect ratio: x/y).
* If present in the dataset and not overwritten using setWidthHeightRatio(), the following
* attributes are checked in order to determine this value:
* - Pixel Spacing, Imager Pixel Spacing, Nominal Scanned Pixel Spacing, Pixel Aspect Ratio.
* The first attribute (Pixel Spacing) is checked both on the main dataset level and within
* the Pixel Measures Sequence of the Shared Functional Groups Sequence (if present).
*
** @return pixel aspect ratio (floating point value)
*/
inline double getWidthHeightRatio() const
{
return (Image != NULL) ?
Image->getColumnRowRatio() : 0;
}
/** get height width ratio (pixel aspect ratio: y/x).
* If present in the dataset and not overwritten using setWidthHeightRatio(), the following
* attributes are checked in order to determine this value:
* - Pixel Spacing, Imager Pixel Spacing, Nominal Scanned Pixel Spacing, Pixel Aspect Ratio
* The first attribute (Pixel Spacing) is checked both on the main dataset level and within
* the Pixel Measures Sequence of the Shared Functional Groups Sequence (if present).
*
** @return pixel aspect ratio (floating point value)
*/
inline double getHeightWidthRatio() const
{
return (Image != NULL) ?
Image->getRowColumnRatio() : 0;
}
/** set width height ratio (pixel aspect ratio: x/y)
*
** @param ratio pixel aspect ratio (x/y)
*
** @return status code (true if successful)
*/
inline int setWidthHeightRatio(const double ratio) const
{
return (Image != NULL) ?
Image->setColumnRowRatio(ratio) : 0;
}
/** set height width ratio (pixel aspect ratio: y/x)
*
** @param ratio pixel aspect ratio (y/x)
*
** @return status code (true if successful)
*/
inline int setHeightWidthRatio(const double ratio) const
{
return (Image != NULL) ?
Image->setRowColumnRatio(ratio) : 0;
}
/** check whether given output value is unused
*
** @param value output value to be checked
*
** @return status, true if unused (1 = within output range, 2 = out of range), false otherwise
*/
inline int isOutputValueUnused(const unsigned long value)
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->isValueUnused(value) : 0;
}
// --- output: return pointer to output data if successful
/** get number of bytes required for the rendered output of a single frame.
* This function determines the size of a rendered frame as created by getOutputData().
* Therefore, it can be used to allocate a sufficiently large memory buffer and pass
* its size to the second variant of getOutputData().
*
** @param bits number of bits per sample used to render the pixel data
* (image depth, 1..MAX_BITS, 0 means 'bits stored' in the image)
* (MI_PastelColor = -1 for true color pastel mode, EXPERIMENTAL)
*
** @return number of bytes if successful, 0 otherwise
*/
inline unsigned long getOutputDataSize(const int bits = 0) const
{
return (Image != NULL) ?
Image->getOutputDataSize(Image->getBits(bits)) : 0;
}
/** render pixel data and return pointer to internal memory buffer.
* apply VOI/PLUT transformation and (visible) overlay planes.
* internal memory buffer will be delete for the next getBitmap/Output operation.
* output data is always padded to 8, 16, 32, ... bits (bits allocated).
* Supported output color models: Monochrome 2 for monochrome images and RGB
* (or YCbCr_Full if flag CIF_KeepYCbCrColorModel is set) for color images.
* The rendered pixel data is always unsigned.
*
** @param bits number of bits per sample used to render the pixel data
* (image depth, 1..MAX_BITS, 0 means 'bits stored' in the image)
* (MI_PastelColor = -1 for true color pastel mode, EXPERIMENTAL)
* @param frame number of frame to be rendered (0..n-1)
* @param planar 0 = color-by-pixel (R1G1B1...R2G2B2...R3G3B3...),
* 1 = color-by-plane (R1R2R3...G1G2G3...B1B2B3...)
* (only applicable to multi-planar/color images, otherwise ignored)
*
** @return pointer to internal memory buffer containing rendered pixel data
* (if successful, NULL otherwise)
*/
inline const void *getOutputData(const int bits = 0,
const unsigned long frame = 0,
const int planar = 0)
{
return (Image != NULL) ?
Image->getOutputData(frame, Image->getBits(bits), planar) : NULL;
}
/** render pixel data and output to given memory buffer.
* apply VOI/PLUT transformation and (visible) overlay planes.
* output data is always padded to 8, 16, 32, ... bits (bits allocated).
* Supported output color models: Monochrome 2 for monochrome images and RGB
* (or YCbCr_Full if flag CIF_KeepYCbCrColorModel is set) for color images.
* The rendered pixel data is always unsigned.
*
** @param buffer pointer to memory buffer (must already be allocated)
* @param size size of memory buffer (will be checked whether it is sufficient)
* @param bits number of bits per sample used to render the pixel data
* (image depth, 1..MAX_BITS, 0 means 'bits stored' in the image)
* (MI_PastelColor = -1 for true color pastel mode, EXPERIMENTAL)
* @param frame number of frame to be rendered (0..n-1)
* @param planar 0 = color-by-pixel (R1G1B1...R2G2B2...R3G3B3...),
* 1 = color-by-plane (R1R2R3...G1G2G3...B1B2B3...)
* (only applicable to multi-planar/color images, otherwise ignored)
*
** @return status code (true if successful)
*/
inline int getOutputData(void *buffer,
const unsigned long size,
const int bits = 0,
const unsigned long frame = 0,
const int planar = 0)
{
return (Image != NULL) ?
Image->getOutputData(buffer, size, frame, Image->getBits(bits), planar) : 0;
}
/** render pixel data and return pointer to given plane (internal memory buffer).
* apply VOI/PLUT transformation and (visible) overlay planes
* internal memory buffer will be delete for the next getBitmap/Output operation.
* Supported output color models: Monochrome 2 for monochrome images and RGB
* (or YCbCr_Full if flag CIF_KeepYCbCrColorModel is set) for color images.
* The rendered pixel data is always unsigned.
*
** @param plane number of plane to be rendered
*
** @return pointer to internal memory buffer containing rendered pixel data
* (if successful, NULL otherwise)
*/
inline const void *getOutputPlane(const int plane) const
{
return (Image != NULL) ?
Image->getOutputPlane(plane) : NULL;
}
/** delete internal memory buffer used for rendered images.
* Save memory if data is no longer needed.
*/
inline void deleteOutputData() const
{
if (Image != NULL)
Image->deleteOutputData();
}
// --- misc
/** check whether image is monochrome or not.
*
** @return true if image is monochrome, false otherwise (i.e. color image)
*/
inline int isMonochrome() const
{
return (PhotometricInterpretation == EPI_Monochrome1) || (PhotometricInterpretation == EPI_Monochrome2);
}
/** get code for photometric interpretation (color model).
*
** @return code for photometric interpretation of the image
*/
inline EP_Interpretation getPhotometricInterpretation() const
{
return PhotometricInterpretation;
}
/** check whether image has given SOP class UID.
*
** @return true if image has given SOP class UID, false otherwise
*/
int hasSOPclassUID(const char *uid) const;
/** get intermediate pixel data representation (read-only).
* This function allows to access the pixel data after they have been extracted
* from the DICOM data element and the modality transformation has been applied
* (if present and not disabled). Please note that for monochrome images the
* internal representation might be signed whereas color images are automatically
* converted to unsigned RGB format. Pixels are aligned to 8, 16 or 32 bits.
* Always use DiPixel::getRepresentation() in order to determine the integer
* representation of the internally stored pixel data.
*
** @return pointer to intermediate pixel data representation
*/
inline const DiPixel *getInterData() const
{
return (Image != NULL) ?
Image->getInterData() : NULL;
}
// --- display function for output device characteristic (calibration):
// only applicable to grayscale images
/** get display function
*
** @return pointer to current display function, NULL if absent
*/
inline DiDisplayFunction *getDisplayFunction() const
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->getDisplayFunction() : OFstatic_cast(DiDisplayFunction *, NULL);
}
/** set display function
*
** @param display object describing the output device characteristic (only referenced!)
*
** @return true if successful, false otherwise
*/
inline int setDisplayFunction(DiDisplayFunction *display)
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->setDisplayFunction(display) : 0;
}
/** set no display function.
* disables display function transformation, object is not deleted!
*
** @return true if successful (1 = disabled current function,
* 2 = there was no function to disable),
* false otherwise
*/
inline int setNoDisplayFunction()
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->setNoDisplayFunction() : 0;
}
/** delete specified display LUT(s)
*
** @param bits parameter of LUT to be deleted (0 = all)
*
** @return true if successful, false otherwise
*/
inline int deleteDisplayLUT(const int bits = 0)
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->deleteDisplayLUT(bits) : 0;
}
/** convert P-value to DDL.
* conversion uses display LUT if present, linear scaling otherwise.
*
** @param pvalue P-value to be converted (0..65535)
* @param ddl reference to resulting DDL
* @param bits number of bits for output
*
** @return true if successful (1 = display function transformation,
* 2 = linear scaling),
* false otherwise
*/
inline int convertPValueToDDL(const Uint16 pvalue,
Uint16 &ddl,
const int bits = 8)
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->convertPValueToDDL(pvalue, ddl, bits) : 0;
}
// --- windowing (voi): only applicable to grayscale images
// return true if successful (see also 'dimoimg.cc')
/** unset all VOI transformations (windows and LUTs).
* only applicable to monochrome images
*
** @return true if successful (1 = previous window/LUT has been valid,
* 2 = otherwise),
* false otherwise (image is invalid or not monochrome)
*/
inline int setNoVoiTransformation()
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->setNoVoiTransformation() : 0;
}
/** set automatically calculated minimum/maximum window.
* possibly active VOI LUT is implicitly disabled.
* Please note that the min/max values refer to the full pixel data (i.e. including
* all possible present frames as specified in the constructor of this class).
*
** @param idx ignore global min/max values if true (1)
*
** @return true if successful (1 = window has changed,
* 2 = new window is the same as previous one),
* false otherwise
*/
inline int setMinMaxWindow(const int idx = 0)
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->setMinMaxWindow(idx) : 0;
}
/** set automatically calculated histogram window.
* possibly active VOI LUT is implicitly disabled.
*
** @param thresh threshold value specifying percentage of histogram border which
* shall be ignored (defaut: 5%).
*
** @return true if successful, false otherwise
*/
inline int setHistogramWindow(const double thresh = 0.05)
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->setHistogramWindow(thresh) : 0;
}
/** set automatically calculated VOI window for the specified Region of Interest (ROI).
* The ROI is specified by means of a rectangle (left, top, width, height). Only the part
* of the ROI that overlaps with the image is regarded - if the overlapping area is empty
* this method returns false (0).
* Possibly active VOI LUT is implicitly disabled.
*
** @param left_pos x-coordinate of the top left-hand corner of the ROI (starting from 0)
* @param top_pos y-coordinate of the top left-hand corner of the ROI (starting from 0)
* @param width width in pixels of the rectangular ROI (minimum: 1)
* @param height height in pixels of the rectangular ROI (minimum: 1)
* @param frame index of the frame to be used for calculation (default: 0 = first)
*
** @return true if successful (1 = window has changed,
* 2 = new window is the same as previous one),
* false otherwise
*/
inline int setRoiWindow(const unsigned long left_pos,
const unsigned long top_pos,
const unsigned long width,
const unsigned long height,
const unsigned long frame = 0)
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->setRoiWindow(left_pos, top_pos, width, height, frame) : 0;
}
/** set specified VOI window (given by index to window width/center sequence stored in image
* file).
* possibly active VOI LUT is implicitly disabled.
* NB: This function does nothing if the flag CIF_UsePresentationState is set.
*
** @param window index to window width/center sequence (0..n-1)
*
** @return true if successful, false otherwise (none monochrome or invalid index)
*/
inline int setWindow(const unsigned long window)
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->setWindow(window) : 0;
}
/** set specified VOI window (given by window width and center).
* possibly active VOI LUT is implicitly disabled.
*
** @param center center of specified window
* @param width width of specified window (>= 1.0)
*
** @return true if successful (1 = window has changed,
* 2 = new window is the same as previous one),
* false otherwise
*/
inline int setWindow(const double center,
const double width)
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->setWindow(center, width) : 0;
}
/** get current VOI window as window center and width values
*
** @param center return current window center value
* @param width return current window width value
*
** @return true if successful, false otherwise
*/
inline int getWindow(double &center,
double &width)
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->getWindow(center, width) : 0;
}
/** get number of VOI windows (stored in image file).
* NB: This function does nothing if the flag CIF_UsePresentationState is set.
*
** @return number of VOI windows
*/
inline unsigned long getWindowCount() const
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->getWindowCount() : 0;
}
/** set VOI LUT function
*
** @param function type of VOI LUT function (default, linear or sigmoid).
* 'default' basically means the same as 'linear'.
*
** @return true if successful (1 = function has changed,
* 2 = function has not changed),
* false otherwise
*/
inline int setVoiLutFunction(const EF_VoiLutFunction function)
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->setVoiLutFunction(function) : 0;
}
/** get VOI LUT function.
* possible values are: EFV_Default, EFV_Linear, EFV_Sigmoid.
*
** @return currently active VOI LUT function or EFV_Default if not set
*/
inline EF_VoiLutFunction getVoiLutFunction() const
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->getVoiLutFunction() : EFV_Default;
}
/** set VOI LUT (given by dcmdata elements).
* possibly active window/center is implicitly disabled.
* Given data is only referenced and not copied! Make sure that the corresponding DcmXXX
* objects exist as long as the VOI LUT is set.
*
** @param data contains LUT data
* @param descriptor describes LUT structure
* @param explanation free form description of VOI LUT (optional)
* @param descripMode mode specifying the use of the bits per table entry value
*
** @return true if successful, false otherwise
*/
inline int setVoiLut(const DcmUnsignedShort &data,
const DcmUnsignedShort &descriptor,
const DcmLongString *explanation = NULL,
const EL_BitsPerTableEntry descripMode = ELM_UseValue)
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->setVoiLut(data, descriptor, explanation, descripMode) : 0;
}
/** set VOI LUT (given by index to VOI LUT sequence stored in image file).
* possibly active window/center is implicitly disabled.
* NB: This function does nothing if the flag CIF_UsePresentationState is set.
*
** @param table index to VOI LUT sequence (0..n-1)
* @param descripMode mode specifying the use of the bits per table entry value
*
** @return true if successful, false otherwise (none monochrome or invalid index)
*/
inline int setVoiLut(const unsigned long table,
const EL_BitsPerTableEntry descripMode = ELM_UseValue)
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->setVoiLut(table, descripMode) : 0;
}
/** get number of VOI LUTs (stored in image file)
*
** @return number of VOI LUTs
*/
inline unsigned long getVoiLutCount() const
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->getVoiLutCount() : 0;
}
/** get description of active VOI transformation
*
** @return pointer to description text (NULL if absent)
*/
inline const char *getVoiTransformationExplanation() const
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->getVoiTransformationExplanation() : OFstatic_cast(const char *, NULL);
}
/** get description of specified VOI window (stored in the image file)
*
** @param window index of the stored VOI window (0..n-1)
* @param explanation variable in which the explanation string is stored
*
** @return pointer to description text (NULL if absent or index invalid)
*/
inline const char *getVoiWindowExplanation(const unsigned long window,
OFString &explanation) const
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->getVoiWindowExplanation(window, explanation) : OFstatic_cast(const char *, NULL);
}
/** get description of specified VOI LUT (stored in the image file)
*
** @param table index of the stored VOI LUT (0..n-1)
* @param explanation variable in which the explanation string is stored
*
** @return pointer to description text (NULL if absent or index invalid)
*/
inline const char *getVoiLutExplanation(const unsigned long table,
OFString &explanation) const
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->getVoiLutExplanation(table, explanation) : OFstatic_cast(const char *, NULL);
}
/** get description of performed modality LUT transformation
*
** @return pointer to description text (NULL if absent)
*/
inline const char *getModalityLutExplanation() const
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->getModalityLutExplanation() : OFstatic_cast(const char *, NULL);
}
// --- hardcopy parameters
/** get polarity. applicable to monochrome and color images.
* possible values are EPP_Normal and EPP_Reverse
*
** @return currently active polarity mode or EPP_Normal if not applicable
*/
inline EP_Polarity getPolarity() const
{
return (Image != NULL) ?
Image->getPolarity() : EPP_Normal;
}
/** set polarity. applicable to monochrome and color images.
*
** @param polarity polarity (normal or reverse)
*
** @return true if successful (1 = polarity has changed,
* 2 = polarity has not changed),
* false otherwise
*/
inline int setPolarity(const EP_Polarity polarity)
{
return (Image != NULL) ?
Image->setPolarity(polarity) : 0;
}
/** set hardcopy parameters. only applicable to monochrome images.
* used to display LinOD images
*
** @param min minimum density of the print-out (in hundreds of Optical Density,
* e.g. 150 means 1.5 OD)
* @param max maximum density of the print-out (ditto)
* @param reflect reflected ambient light (in candela per square meter - cd/m^2)
* @param illumin illumination (ditto)
*
** @return true if successful (1 = at least one of the parameters has changed,
* 2 = no parameter has changed),
* false otherwise
*/
inline int setHardcopyParameters(const unsigned int min,
const unsigned int max,
const unsigned int reflect,
const unsigned int illumin)
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->setHardcopyParameters(min, max, reflect, illumin) : 0;
}
// --- presentation LUT: only applicable to grayscale images
/** get shape for presentation transformation.
* possible values are: ESP_Default, ESP_Identity, ESP_Inverse, ESP_LinOD.
* If a presentation LUT is currently active ESP_Default is always returned.
*
** @return currently active presentation LUT shape or ESP_Default if not set
*/
inline ES_PresentationLut getPresentationLutShape() const
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->getPresentationLutShape() : ESP_Default;
}
/** set shape for presentation transformation.
* possibly active presentation LUT is implicitly disabled.
*
** @param shape presentation LUT shape (default, identity, inverse or lin OD).
* 'default' means that the output data is always created with 0 for black
* and maxvalue for white (i.e. monochrome2 data is created for output).
*
** @return true if successful (1 = shape has changed,
* 2 = shape has not changed),
* false otherwise
*/
inline int setPresentationLutShape(const ES_PresentationLut shape)
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->setPresentationLutShape(shape) : 0;
}
/** set LUT for presentation transformation.
* possibly active presentation LUT is implicitly disabled.
* Given data is only referenced and not copied! Make sure that the corresponding DcmXXX
* objects exist as long as the presentation LUT is set.
*
** @param data contains LUT data
* @param descriptor describes LUT structure
* @param explanation free form description of presentation LUT (optional)
* @param descripMode mode specifying the use of the bits per table entry value
*
** @return true if successful, false otherwise
*/
inline int setPresentationLut(const DcmUnsignedShort &data,
const DcmUnsignedShort &descriptor,
const DcmLongString *explanation = NULL,
const EL_BitsPerTableEntry descripMode = ELM_UseValue)
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->setPresentationLut(data, descriptor, explanation, descripMode) : 0;
}
/** get description of active presentation LUT
*
** @return pointer to description text (NULL if absent)
*/
inline const char *getPresentationLutExplanation() const
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->getPresentationLutExplanation() : OFstatic_cast(const char *, NULL);
}
/** set inverse LUT for presentation transformation.
* this LUT transform is e.g. used for DICOM print (12->8, 8->12 bit)
* possibly active presentation LUT will not be considered!
*
** @param data contains LUT data
* @param descriptor describes LUT structure
* @param descripMode mode specifying the use of the bits per table entry value
*
** @return true if successful, false otherwise
*/
inline int setInversePresentationLut(const DcmUnsignedShort &data,
const DcmUnsignedShort &descriptor,
const EL_BitsPerTableEntry descripMode = ELM_UseValue)
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->setInversePresentationLut(data, descriptor, descripMode) : 0;
}
// --- overlays: return true (!0) if successful (see also 'diovlay.cc')
// only applicable to grayscale images
/** add specified plane to group of additional overlay planes.
* replaces old overlay plane if group number already exists.
*
** @param group group number (0x60nn) of overlay plane
* @param width width of overlay plane (in pixels)
* @param height height of overlay plane (in pixels)
* @param left_pos x coordinate of plane origin (referring to image origin)
* @param top_pos y coordinate of plane origin
* @param data overlay plane data (dcmdata element)
* @param label overlay plane label
* @param description overlay plane description
* @param mode display mode (see 'diutils.h')
*
** @return false (0) if an error occurred, true otherwise (1 = added new plane,
* 2 = replaced existing plane)
*/
inline int addOverlay(const unsigned int group,
const signed int left_pos,
const signed int top_pos,
const unsigned int width,
const unsigned int height,
const DcmOverlayData &data,
const DcmLongString &label,
const DcmLongString &description,
const EM_Overlay mode = EMO_Default)
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->addOverlay(group, left_pos, top_pos, width, height, data, label, description, mode) : 0;
}
/** remove specified (additional) overlay plane
*
** @param group group number (0x60nn) of overlay plane
*
** @return false (0) if an error occurred (e.g. plane doesn't exist), true otherwise
*/
inline int removeOverlay(const unsigned int group)
{
return ((Image != NULL) && (Image->getOverlayPtr(1) != NULL)) ?
Image->getOverlayPtr(1)->removePlane(group) : 0;
}
/** remove all additional overlay planes
*
** @return false (0) if an error occurred, true otherwise (1 = all planes deleted,
* 2 = no planes to be deleted)
*/
inline int removeAllOverlays()
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->removeAllOverlays() : 0;
}
/** check whether specified overlay plane is visible/activated.
* see show/hideOverlay() to modify the visibility status.
*
** @param plane number (0..15) or group number (0x60nn) of overlay plane
* @param idx index of overlay group (0 = dataset, 1 = additional), default: 0
*
** @return true (1) if overlay plane is visible, false (0) otherwise
*/
inline int isOverlayVisible(const unsigned int plane,
const unsigned int idx = 0)
{
return ((Image != NULL) && (Image->getOverlayPtr(idx) != NULL)) ?
Image->getOverlayPtr(idx)->isPlaneVisible(plane) : 0;
}
/** activate specified overlay plane
*
** @param plane number (0..15) or group number (0x60nn) of overlay plane
* @param idx index of overlay group (0 = dataset, 1 = additional), default: 0
*
** @return false (0) if an error occurred, true otherwise (1 = plane successfully activated,
* 2 = plane has already been visible)
*/
inline int showOverlay(const unsigned int plane,
const unsigned int idx = 0)
{
return ((Image != NULL) && (Image->getOverlayPtr(idx) != NULL)) ?
Image->getOverlayPtr(idx)->showPlane(plane) : 0;
}
/** activate specified overlay plane and change some parameters
*
** @param plane number (0..15) or group number (0x60nn) of overlay plane
* @param mode display mode (see 'diutils.h')
* @param fore plane's foreground color (in percent, default: 1.0)
* @param thresh threshold value (in percent, default: 0.5), only for EMO_ThresholdReplace
* @param idx index of overlay group (0 = dataset, 1 = additional), default: 0
*
** @return false (0) if an error occurred, true otherwise
*/
inline int showOverlay(const unsigned int plane,
const EM_Overlay mode,
const double fore = 1.0,
const double thresh = 0.5,
const unsigned int idx = 0)
{
return ((Image != NULL) && (Image->getOverlayPtr(idx) != NULL)) ?
Image->getOverlayPtr(idx)->showPlane(plane, fore, thresh, mode) : 0;
}
/** activate specified overlay plane and change 'pvalue' (only for bitmap shutters)
*
** @param plane number (0..15) or group number (0x60nn) of overlay plane
* @param pvalue P-value used to display overlay plane
*
** @return false (0) if an error occurred, true otherwise
*/
inline int showOverlay(const unsigned int plane,
const Uint16 pvalue)
{
return ((Image != NULL) && (Image->getOverlayPtr(1) != NULL)) ?
Image->getOverlayPtr(1)->showPlane(plane, pvalue) : 0;
}
/** activate all overlay planes (make them visible)
*
** @param idx index of overlay group (0 = dataset, 1 = additional), default: 0
*
** @return false (0) if an error occurred, true otherwise (1 = planes have been successfully activated,
* 2 = no planes to be activated)
*/
inline int showAllOverlays(const unsigned int idx = 0)
{
return ((Image != NULL) && (Image->getOverlayPtr(idx) != NULL)) ?
Image->getOverlayPtr(idx)->showAllPlanes() : 0;
}
/** activate all overlay planes and set specified parameters
*
** @param mode display mode (see 'diutils.h')
* @param fore plane's foreground color (in percent, default: 1.0)
* @param thresh threshold value (in percent, default: 0.5), only for EMO_ThresholdReplace
* @param idx index of overlay group (0 = dataset, 1 = additional), default: 0
*
** @return false (0) if an error occurred, true otherwise (1 = planes have been successfully activated,
* 2 = no planes to be activated)
*/
inline int showAllOverlays(const EM_Overlay mode,
const double fore = 1,
const double thresh = 0.5,
const unsigned int idx = 0)
{
return ((Image != NULL) && (Image->getOverlayPtr(idx) != NULL)) ?
Image->getOverlayPtr(idx)->showAllPlanes(fore, thresh, mode) : 0;
}
/** deactivate specified overlay plane
*
** @param plane number (0..15) or group number (0x60nn) of overlay plane
* @param idx index of overlay group (0 = dataset, 1 = additional), default: 0
*
** @return false (0) if an error occurred, true otherwise (1 = plane successfully deactivated,
* 2 = plane has already been invisible)
*/
inline int hideOverlay(const unsigned int plane,
const unsigned int idx = 0)
{
return ((Image != NULL) && (Image->getOverlayPtr(idx) != NULL)) ?
Image->getOverlayPtr(idx)->hidePlane(plane) : 0;
}
/** deactivate all overlay planes (make them invisible)
*
** @param idx index of overlay group (0 = dataset, 1 = additional), default: 0
*
** @return false (0) if an error occurred, true otherwise (1 = planes have been successfully deactivated,
* 2 = no planes to be deactivated)
*/
inline int hideAllOverlays(const unsigned int idx = 0)
{
return ((Image != NULL) && (Image->getOverlayPtr(idx) != NULL)) ?
Image->getOverlayPtr(idx)->hideAllPlanes() : 0;
}
/** move origin of specified overlay plane to given position
*
** @param plane number (0..15) or group number (0x60nn) of overlay plane
* @param left_pos x coordinate of new plane origin (origin = 0)
* @param top_pos y coordinate of new plane origin (origin = 0)
* @param idx index of overlay group (0 = dataset, 1 = additional), default: 0
*
** @return false (0) if an error occurred, true otherwise (1 = plane has been successfully moved,
* 2 = old and new position are equal, nothing to do)
*/
inline int placeOverlay(const unsigned int plane,
const signed int left_pos,
const signed int top_pos,
const unsigned int idx = 0)
{
return ((Image != NULL) && (Image->getOverlayPtr(idx) != NULL)) ?
Image->getOverlayPtr(idx)->placePlane(plane, left_pos, top_pos) : 0;
}
/** get number of overlay planes
*
** @param idx index of overlay group (0 = dataset, 1 = additional), default: 0
*
** @return number of overlay planes stored in the image
*/
inline unsigned int getOverlayCount(const unsigned int idx = 0) const
{
return ((Image != NULL) && (Image->getOverlayPtr(idx) != NULL)) ?
Image->getOverlayPtr(idx)->getCount() : 0;
}
/** get group number of specified overlay plane
*
** @param plane number (0..15) or group number (0x60nn) of overlay plane
* @param idx index of overlay group (0 = dataset, 1 = additional), default: 0
*
** @return group number of given overlay plane if successful, false (0) otherwise
*/
inline unsigned int getOverlayGroupNumber(const unsigned int plane,
const unsigned int idx = 0) const
{
return ((Image != NULL) && (Image->getOverlayPtr(idx) != NULL)) ?
Image->getOverlayPtr(idx)->getPlaneGroupNumber(plane) : 0;
}
/** get label of specified overlay plane
*
** @param plane number (0..15) or group number (0x60nn) of overlay plane
* @param idx index of overlay group (0 = dataset, 1 = additional), default: 0
*
** @return pointer to overlay plane label if successful, false (NULL) otherwise
*/
inline const char *getOverlayLabel(const unsigned int plane,
const unsigned int idx = 0) const
{
return ((Image != NULL) && (Image->getOverlayPtr(idx) != NULL)) ?
Image->getOverlayPtr(idx)->getPlaneLabel(plane) : OFstatic_cast(const char *, NULL);
}
/** get description of specified overlay plane
*
** @param plane number (0..15) or group number (0x60nn) of overlay plane
* @param idx index of overlay group (0 = dataset, 1 = additional), default: 0
*
** @return pointer to overlay plane description if successful, false (NULL) otherwise
*/
inline const char *getOverlayDescription(const unsigned int plane,
const unsigned int idx = 0) const
{
return ((Image != NULL) && (Image->getOverlayPtr(idx) != NULL)) ?
Image->getOverlayPtr(idx)->getPlaneDescription(plane) : OFstatic_cast(const char *, NULL);
}
/** get mode of specified overlay plane
*
** @param plane number (0..15) or group number (0x60nn) of overlay plane
* @param idx index of overlay group (0 = dataset, 1 = additional), default: 0
*
** @return mode of overlay plane if successful, EMO_Default otherwise
*/
inline EM_Overlay getOverlayMode(const unsigned int plane,
const unsigned int idx = 0) const
{
return ((Image != NULL) && (Image->getOverlayPtr(idx) != NULL)) ?
Image->getOverlayPtr(idx)->getPlaneMode(plane) : EMO_Default;
}
/** create bitmap for specified overlay plane.
* (up to 16 bits per pixel with two values: 'fore' and 'back')
* Please note that the current origin of the overlay plane is used. Furthermore, the size
* of the overlay plane is restricted to the size of the surrounding image. Use the method
* getFullOverlayData() if the complete bitmap data is required regardless of its position.
*
** @param plane number (0..15) or group number (0x60nn) of overlay plane
* @param width returns width of overlay plane (in pixels)
* @param height returns height of overlay plane (in pixels)
* @param left_pos returns x coordinate of plane's origin
* @param top_pos returns y coordinate of plane's origin
* @param mode returns display mode (see 'diutils.h')
* @param frame index of frame used for output (default: 0 = first)
* @param bits number of bits (stored) in the resulting array, default: 8, range: 1..16
* Used to mask the values for foreground and background color. The resulting
* array is always padded to 8 or 16 bits with 1, 8 or 16 bits allocated
* depending on the value of 'bits'.
* @param fore foreground color to be set in bitmap, default: 255, range: 0..2^bits-1
* @param back background color to be set in bitmap (transparent), default: 0, range: 0..2^bits-1
* @param idx index of overlay group (0 = dataset, planes stored in the image dataset;
* 1 = additional, planes added by addOverlay();
* 2 = 'additional' overlay planes hide 'dataset' planes
* when the overlay group number exists in both),
* default: 2
*
** @return pointer to overlay plane data (internal memory buffer)
*/
const void *getOverlayData(const unsigned int plane,
unsigned int &left_pos,
unsigned int &top_pos,
unsigned int &width,
unsigned int &height,
EM_Overlay &mode,
const unsigned long frame = 0,
const int bits = 8,
const Uint16 fore = 0xff,
const Uint16 back = 0x0,
const unsigned int idx = 2) const
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->getOverlayData(frame, plane, left_pos, top_pos, width, height, mode, idx, bits, fore, back) : NULL;
}
/** create bitmap for specified overlay plane.
* (up to 16 bits per pixel with two values: 'fore' and 'back')
* In contrast to the previous method the full bitmap data is always returned.
*
** @param plane number (0..15) or group number (0x60nn) of overlay plane
* @param width returns width of overlay plane (in pixels)
* @param height returns height of overlay plane (in pixels)
* @param frame index of frame used for output (default: 0 = first)
* @param bits number of bits (stored) in the resulting array, default: 8, range: 1..16
* Used to mask the values for foreground and background color. The resulting
* array is always padded to 8 or 16 bits with 1, 8 or 16 bits allocated
* depending on the value of 'bits'.
* @param fore foreground color to be set in bitmap, default: 255, range: 0..2^bits-1
* @param back background color to be set in bitmap (transparent), default: 0, range: 0..2^bits-1
* @param idx index of overlay group (0 = dataset, planes stored in the image dataset;
* 1 = additional, planes added by addOverlay()),
* default: 0
*
** @return pointer to overlay plane data (internal memory buffer)
*/
const void *getFullOverlayData(const unsigned int plane,
unsigned int &width,
unsigned int &height,
const unsigned long frame = 0,
const int bits = 8,
const Uint16 fore = 0xff,
const Uint16 back = 0x0,
const unsigned int idx = 0) const
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->getFullOverlayData(frame, plane, width, height, idx, bits, fore, back) : NULL;
}
/** delete buffer for overlay plane data.
* Save memory if data is no longer needed.
*/
inline void deleteOverlayData() const
{
if ((Image != NULL) && (Image->getMonoImagePtr() != NULL))
Image->getMonoImagePtr()->deleteOverlayData();
}
/** create bitmap for specified overlay plane and store it in (6xxx,3000) format.
* (1 bit allocated and stored, foreground color is 1, background color is 0,
* data is 16 bit padded - even length)
* memory is allocated but not handled internally - must be deleted from calling program.
*
** @param buffer stores pointer to overlay data (memory is allocated internally)
* @param plane number (0..15) or group number (0x60nn) of overlay plane
* @param width returns width of overlay plane (in pixels)
* @param height returns height of overlay plane (in pixels)
* @param frames returns number of frames
* @param idx index of overlay group (0 = dataset, planes stored in the image dataset;
* 1 = additional, planes added by addOverlay()),
* default: 0
*
** @return number of bytes allocated for the 'buffer' if successful, 0 otherwise
*/
unsigned long create6xxx3000OverlayData(Uint8 *&buffer,
const unsigned int plane,
unsigned int &width,
unsigned int &height,
unsigned long &frames,
const unsigned int idx = 0) const
{
return ((Image != NULL) && (Image->getMonoImagePtr() != NULL)) ?
Image->getMonoImagePtr()->create6xxx3000OverlayData(buffer, plane, width, height, frames, idx) : 0;
}
// --- create...Image: return pointer to new 'DicomImage' object, memory isn't handled internally !
/** create copy of current image object.
* memory is not handled internally - must be deleted from calling program.
*
** @param fstart first frame to be processed (0 = 1st frame)
* @param fcount number of frames (0 = all frames)
*
** @return pointer to new DicomImage object (NULL if an error occurred)
*/
DicomImage *createDicomImage(unsigned long fstart = 0,
unsigned long fcount = 0) const;
/** create scaled copy of current image object (given by exact size).
* memory is not handled internally - must be deleted from calling program.
*
** @param width width of new image (in pixels)
* @param height height of new image (in pixels)
* @param interpolate specifies whether scaling algorithm should use interpolation (if necessary).
* default: no interpolation (0), preferred interpolation algorithm (if applicable):
* 1 = pbmplus algorithm, 2 = c't algorithm, 3 = bilinear magnification,
* 4 = bicubic magnification
* @param aspect specifies whether pixel aspect ratio should be taken into consideration
* (if true, width OR height should be 0, i.e. this component will be calculated
* automatically)
*
** @return pointer to new DicomImage object (NULL if an error occurred)
*/
DicomImage *createScaledImage(const unsigned long width,
const unsigned long height = 0,
const int interpolate = 0,
int aspect = 0) const;
/** create scaled copy of current image object (given by scaling factors).
* memory is not handled internally - must be deleted from calling program.
*
** @param xfactor width of new image is multiplied with this factor (> 0)
* @param yfactor height of new image is multiplied with this factor (> 0)
* @param interpolate specifies whether scaling algorithm should use interpolation (if necessary).
* default: no interpolation (0), preferred interpolation algorithm (if applicable):
* 1 = pbmplus algorithm, 2 = c't algorithm, 3 = bilinear magnification,
* 4 = bicubic magnification
* @param aspect specifies whether pixel aspect ratio should be taken into consideration
* (if true, width OR height should be 0, i.e. this component will be calculated
* automatically)
*
** @return pointer to new DicomImage object (NULL if an error occurred)
*/
DicomImage *createScaledImage(const double xfactor,
const double yfactor = 0,
const int interpolate = 0,
const int aspect = 0) const;
/** create scaled copy of specified (clipping) area of the current image object.
* memory is not handled internally - must be deleted from calling program.
* NB: Clipping and interpolated scaling at the same moment is not yet fully implemented!
*
** @param left_pos x coordinate of top left corner of area to be scaled
* (referring to image origin, negative values create a border around the image)
* @param top_pos y coordinate of top left corner of area to be scaled
* @param clip_width width of area to be scaled
* @param clip_height height of area to be scaled
* @param scale_width width of scaled image (in pixels)
* @param scale_height height of scaled image (in pixels)
* @param interpolate specifies whether scaling algorithm should use interpolation (if necessary).
* default: no interpolation (0), preferred interpolation algorithm (if applicable):
* 1 = pbmplus algorithm, 2 = c't algorithm, 3 = bilinear magnification,
* 4 = bicubic magnification
* @param aspect specifies whether pixel aspect ratio should be taken into consideration
* (if true, width OR height should be 0, i.e. this component will be calculated
* automatically)
* @param pvalue P-value used for the border outside the image (0..65535)
*
** @return pointer to new DicomImage object (NULL if an error occurred)
*/
DicomImage *createScaledImage(const signed long left_pos,
const signed long top_pos,
unsigned long clip_width,
unsigned long clip_height,
unsigned long scale_width = 0,
unsigned long scale_height = 0,
const int interpolate = 0,
int aspect = 0,
const Uint16 pvalue = 0) const;
/** create scaled copy of specified (clipping) area of the current image object.
* memory is not handled internally - must be deleted from calling program.
* NB: Clipping and interpolated scaling at the same moment is not yet fully implemented!
*
** @param left_pos x coordinate of top left corner of area to be scaled
* (referring to image origin, negative values create a border around the image)
* @param top_pos y coordinate of top left corner of area to be scaled
* @param width width of area to be scaled
* @param height height of area to be scaled
* @param xfactor width of new image is multiplied with this factor (> 0)
* @param yfactor height of new image is multiplied with this factor (> 0)
* @param interpolate specifies whether scaling algorithm should use interpolation (if necessary).
* default: no interpolation (0), preferred interpolation algorithm (if applicable):
* 1 = pbmplus algorithm, 2 = c't algorithm, 3 = bilinear magnification,
* 4 = bicubic magnification
* @param aspect specifies whether pixel aspect ratio should be taken into consideration
* (if true, width OR height should be 0, i.e. this component will be calculated
* automatically)
* @param pvalue P-value used for the border outside the image (0..65535)
*
** @return pointer to new DicomImage object (NULL if an error occurred)
*/
DicomImage *createScaledImage(const signed long left_pos,
const signed long top_pos,
unsigned long width,
unsigned long height,
const double xfactor,
const double yfactor = 0,
const int interpolate = 0,
const int aspect = 0,
const Uint16 pvalue = 0) const;
/** create copy of specified area of the current image object (clipping).
* memory is not handled internally - must be deleted from calling program.
*
** @param left_pos x coordinate of top left corner of area to be copied
* (referring to image origin, negative values create a border around the image)
* @param top_pos y coordinate of top left corner of area to be copied
* @param width width of area to be copied/clipped
* @param height height of area to be copied/clipped
* @param pvalue P-value used for the border outside the image (0..65535)
*
** @return pointer to new DicomImage object (NULL if an error occurred)
*/
DicomImage *createClippedImage(const signed long left_pos,
const signed long top_pos,
unsigned long width = 0,
unsigned long height = 0,
const Uint16 pvalue = 0) const;
/** flip current image (horizontally and/or vertically)
*
** @param horz flip horizontally if true
* @param vert flip vertically if true
*
** @return true if successful (1 = flipped at least direction,
* 2 = not flipped, because of image resolution - width and/or height equal to 1),
* false otherwise
*/
int flipImage(int horz = 1,
int vert = 0) const;
/** create a flipped copy of the current image.
* memory is not handled internally - must be deleted from calling program.
*
** @param horz flip horizontally if true
* @param vert flip vertically if true
*
** @return pointer to new DicomImage object (NULL if an error occurred)
*/
DicomImage *createFlippedImage(int horz = 1,
int vert = 0) const;
/** rotate current image (by steps of 90 degrees)
*
** @param degree angle by which the image shall be rotated (-360, -270, -180, -90, 0, 90, 180, 270, 360)
*
** @return true if successful (1 = rotated by at least 90 degrees,
* 2 = not rotated, because of image resolution or angle),
* false otherwise
*/
int rotateImage(signed int degree) const;
/** create a rotated copy of the current image.
* memory is not handled internally - must be deleted from calling program.
*
** @param degree angle by which the image shall be rotated (-360, -270, -180, -90, 0, 90, 180, 270, 360)
*
** @return pointer to new DicomImage object (NULL if an error occurred)
*/
DicomImage *createRotatedImage(signed int degree) const;
/** create monochrome copy of the current image.
* equal to createDicomImage() for monochrome images.
* memory is not handled internally - must be deleted from calling program.
* This method does not work if original YCbCr color model is retained (see CIF_KeepYCbCrColorModel).
*
** @param red coefficient by which the red component is weighted (default: NTSC value)
* @param green coefficient by which the green component is weighted (default: NTSC value)
* @param blue coefficient by which the blue component is weighted (default: NTSC value)
*
** @return pointer to new DicomImage object (NULL if an error occurred)
*/
DicomImage *createMonochromeImage(const double red = 0.299,
const double green = 0.587,
const double blue = 0.114) const;
/** create true color (24/32 bit) or palette (8 bit) bitmap for MS Windows.
* 8 bit images require an appropriate color palette (256 entries, values: 0 to 255) and are only
* applicable to monochrome images, the beginning of a each line starts on a 32-bit address (if
* 'padding' is true); 24 bit images store 24 bits per pixel (BGR) and do align each line to a
* 32-bit address (if 'padding' is true); 32 bit images store 32 bits per pixel (ARGB), but only
* use the lower 24 bits (-RGB).
* The memory buffer can be allocated both externally (from the calling program) and internally
* (inside this class/module). If the 'data' parameter is not NULL and the 'size' parameter, which
* describes the size (in bytes) of the allocated buffer, is sufficiently large, the bitmap is stored
* in this buffer. Otherwise (i.e. 'data' is NULL) the memory is allocated internally. Please note
* that in both cases the memory is not handled internally after this method has finished and,
* therefore, must be deleted from the calling program.
* This method does not work if original YCbCr color model is retained (see CIF_KeepYCbCrColorModel).
*
** @param data untyped pointer memory buffer (set to NULL if not allocated externally)
* @param size size of the memory buffer in bytes (if 0 'data' is set to NULL)
* @param frame index of frame to be converted (default: 0 = first frame)
* @param bits number of bits per pixel used for the output bitmap (8, 24 or 32, default: 24)
* @param upsideDown flag indicating whether the first line stored is the top-most (default: 0) or
* the bottom-most of the source image (as required by the BMP file format)
* @param padding align each line to a 32-bit address if true (default)
*
** @return number of bytes allocated by the bitmap, or 0 if an error occurred
*/
unsigned long createWindowsDIB(void *&data,
const unsigned long size,
const unsigned long frame = 0,
const int bits = 24,
const int upsideDown = 0,
const int padding = 1)
{
return (Image != NULL) ?
Image->createDIB(data, size, frame, bits, upsideDown, padding) : 0;
}
/** create true color (32 bit) or palette (8 bit) bitmap for Java (AWT default format).
* 32 bit images allocate 32 bits per pixel (RGB), but only use the upper 24 bits. The sample
* order for color images is: Red, Green, Blue.
* Memory is not handled internally - must be deleted from calling program.
* This method does not work if original YCbCr color model is retained (see CIF_KeepYCbCrColorModel).
*
** @param data resulting pointer to bitmap data (set to NULL if an error occurred)
* @param frame index of frame to be converted (default: 0 = first frame)
* @param bits number of bits per pixel used for the output bitmap (8 or 32, default: 32)
*
** @return number of bytes allocated by the bitmap, or 0 if an error occurred
*/
unsigned long createJavaAWTBitmap(void *&data,
const unsigned long frame = 0,
const int bits = 32)
{
return (Image != NULL) ?
Image->createAWTBitmap(data, frame, bits) : 0;
}
/** create 12 bit packed (monochrome) bitmap for DICOM printers.
* Memory is not handled internally - must be deleted from calling program.
*
** @param buffer pointer to input memory buffer (16 bits allocated, 12 bits stored)
* @param size size of memory buffer (will be checked whether it is sufficient)
* @param count number of entries (pixels) in input buffer
*
** @return pointer to memory buffer containing the packed output bitmap data (NULL if an error occurred)
*/
static void *create12BitPackedBitmap(const void *buffer,
const unsigned long size,
const unsigned long count)
{
return DiMonoImage::createPackedBitmap(buffer, size, count, 16, 12);
}
/** create new single frame DicomImage with applied grayscale transformations.
* The method getOutputData() is used internally for the new bitmap.
* Limited to monochrome images.
*
** @param frame index of frame to be converted
* @param bits number of bits per pixel used for the output bitmap
*
** @return pointer to new DicomImage object (NULL if an error occurred)
*/
DicomImage *createMonoOutputImage(const unsigned long frame,
const int bits);
// --- output image file: return true ('1') if successful
/** render pixel data of the given frame and write image related attributes to DICOM dataset.
* Applies VOI/PLUT transformation and (visible) overlay planes, output data is
* always padded to 8, 16, 32, ... bits (bits allocated). Replaces any modality
* transformation in the dataset by a linear rescale/slope since the modality
* transformation is rendered into the pixel data. Replaces the VOI transformations
* in the dataset by a "max range" VOI window. Removes all Overlay Plane Module
* attributes for embedded overlay planes from the dataset.
* Writes the following DICOM attributes (from Image Pixel Module):
* - Photometric Interpretation, Samples per Pixel
* - Columns, Rows, Number of Frames
* - Bits Allocated, Bits Stored, High Bit
* - Planar Configuration (only if "Samples per Pixel" is greater than 1)
* - Pixel Representation, Pixel Data
* Updates the following DICOM attributes (if present in the original image dataset):
* - Pixel Spacing and/or Pixel Aspect Ratio
* Supported output color models: Monochrome 2 for monochrome images and RGB
* (or YCbCr_Full if flag CIF_KeepYCbCrColorModel is set) for color images.
*
** @param dataset reference to DICOM dataset where the image attributes are stored
* @param bits number of bits per sample (image depth, 1..MAX_BITS)
* @param frame number of frame to be rendered (0..n-1)
* @param planar 0 = color-by-pixel (R1G1B1...R2G2B2...R3G3B3...),
* 1 = color-by-plane (R1R2R3...G1G2G3...B1B2B3...)
* (only applicable to multi-planar/color images, otherwise ignored)
*
** @return true if successful, false otherwise
*/
inline int writeFrameToDataset(DcmItem &dataset,
const int bits = 0,
const unsigned long frame = 0,
const int planar = 0)
{
return (Image != NULL) ?
Image->writeFrameToDataset(dataset, frame, bits, planar) : 0;
}
/** write current image and related attributes to DICOM dataset.
* Uses the internal representation of the pixel data, therefore the output data is
* always padded to 8, 16, 32, ... bits (bits allocated). Replaces any modality
* transformation in the dataset by a linear rescale/slope since the modality
* transformation is rendered into the pixel data. Removes all Overlay Plane Module
* attributes for embedded overlay planes from the dataset.
* Writes the following DICOM attributes (from Image Pixel Module):
* - Photometric Interpretation, Samples per Pixel
* - Columns, Rows, Number of Frames
* - Bits Allocated, Bits Stored, High Bit
* - Planar Configuration (only if "Samples per Pixel" is greater than 1)
* - Pixel Representation, Pixel Data
* Updates the following DICOM attributes (if present in the original image dataset):
* - Pixel Spacing and/or Pixel Aspect Ratio
* Supported output color models: Monochrome 1 or 2 for monochrome images and RGB
* (or YCbCr_Full if flag CIF_KeepYCbCrColorModel is set) for color images.
*
** @param dataset reference to DICOM dataset where the image attributes are stored
* @param mode 0 = determine value of BitsStored from 'used' pixel values,
* 1 = determine value of BitsStored from 'possible' pixel values
* (used for monochrome images only)
* @param planar 0 = color-by-pixel (R1G1B1...R2G2B2...R3G3B3...),
* 1 = color-by-plane (R1R2R3...G1G2G3...B1B2B3...),
* 2 = same as original DICOM image (i.e. color-by-pixel or color-by-plane)
* (only applicable to multi-planar/color images, otherwise ignored)
*
** @return true if successful, false otherwise
*/
inline int writeImageToDataset(DcmItem &dataset,
const int mode = 0,
const int planar = 2)
{
return (Image != NULL) ?
Image->writeImageToDataset(dataset, mode, planar) : 0;
}
/** write pixel data to PPM file (specified by filename).
* pixel data is written in ASCII format.
* This method does not work if original YCbCr color model is retained
* (see CIF_KeepYCbCrColorModel).
*
** @param filename name of output file (%d is replaced by frame number if present)
* @param bits number of bits used for output of pixel data
* (default: full resolution, max: 32;
* MI_PastelColor = -1 for true color pastel mode, EXPERIMENTAL)
* @param frame index of frame used for output (default: first frame = 0)
*
** @return true if successful, false otherwise
*/
int writePPM(const char *filename,
const int bits = 0,
const unsigned long frame = 0);
/** write pixel data to PPM file (specified by open C++ stream).
* pixel data is written in ASCII format.
* This method does not work if original YCbCr color model is retained
* (see CIF_KeepYCbCrColorModel).
*
** @param stream open C++ output stream
* @param bits number of bits used for output of pixel data
* (default: full resolution, max: 32;
* MI_PastelColor = -1 for true color pastel mode, EXPERIMENTAL)
* @param frame index of frame used for output (default: first frame = 0)
*
** @return true if successful, false otherwise
*/
int writePPM(STD_NAMESPACE ostream& stream,
const int bits = 0,
const unsigned long frame = 0);
/** write pixel data to PPM file (specified by open C stream).
* pixel data is written in ASCII format.
* This method does not work if original YCbCr color model is retained
* (see CIF_KeepYCbCrColorModel).
*
** @param stream open C output stream
* @param bits number of bits used for output of pixel data
* (default: full resolution, max: 32;
* MI_PastelColor = -1 for true color pastel mode, EXPERIMENTAL)
* @param frame index of frame used for output (default: first frame = 0)
*
** @return true if successful, false otherwise
*/
int writePPM(FILE *stream,
const int bits = 0,
const unsigned long frame = 0);
/** write pixel data to raw PPM file (specified by filename).
* pixel data is written in binary format.
* This method does not work if original YCbCr color model is retained
* (see CIF_KeepYCbCrColorModel).
*
** @param filename name of output file (%d is replaced by frame number if present)
* @param bits number of bits used for output of pixel data
* (default: full resolution, max: 8;
* MI_PastelColor = -1 for true color pastel mode, EXPERIMENTAL)
* @param frame index of frame used for output (default: first frame = 0)
*
** @return true if successful, false otherwise
*/
int writeRawPPM(const char *filename,
const int bits = 0,
const unsigned long frame= 0);
/** write pixel data to raw PPM file (specified by open C stream).
* pixel data is written in binary format.
* This method does not work if original YCbCr color model is retained
* (see CIF_KeepYCbCrColorModel).
*
** @param stream open C output stream (binary mode required!)
* @param bits number of bits used for output of pixel data
* (default: full resolution, max: 8;
* MI_PastelColor = -1 for true color pastel mode, EXPERIMENTAL)
* @param frame index of frame used for output (default: first frame = 0)
*
** @return true if successful, false otherwise
*/
int writeRawPPM(FILE *stream,
const int bits = 0,
const unsigned long frame = 0);
/** write pixel data to BMP file (specified by open C stream).
* pixel data is written in palette or truecolor mode.
* This method does not work if original YCbCr color model is retained
* (see CIF_KeepYCbCrColorModel).
*
** @param stream open C output stream (binary mode required!)
* @param bits number of bits used for output of pixel data
* (8, 24 or 32, default (0): 8 for monochrome and 24 for color images)
* @param frame index of frame used for output (default: first frame = 0)
*
** @return true if successful, false otherwise
*/
int writeBMP(FILE *stream,
const int bits = 0,
const unsigned long frame = 0);
/** write pixel data to BMP file (specified by filename).
* pixel data is written in palette or truecolor mode.
* This method does not work if original YCbCr color model is retained
* (see CIF_KeepYCbCrColorModel).
*
** @param filename name of output file (%d is replaced by frame number if present)
* @param bits number of bits used for output of pixel data
* (8, 24 or 32, default (0): 8 for monochrome and 24 for color images)
* @param frame index of frame used for output (default: first frame = 0)
*
** @return true if successful, false otherwise
*/
int writeBMP(const char *filename,
const int bits = 0,
const unsigned long frame = 0);
/** write pixel data to pluggable image format file (specified by open C stream).
* Format specific parameters may be set directly in the instantiated 'plugin' class.
*
** @param plugin pointer to image format plugin (derived from abstract class DiPluginFormat)
* @param stream open C output stream (binary mode required!)
* @param frame index of frame used for output (default: first frame = 0)
*
** @return true if successful, false otherwise
*/
int writePluginFormat(const DiPluginFormat *plugin,
FILE *stream,
const unsigned long frame = 0);
/** write pixel data to pluggable image format file (specified by filename).
* Format specific parameters may be set directly in the instantiated 'plugin' class.
*
** @param plugin pointer to image format plugin (derived from abstract class DiPluginFormat)
* @param filename name of output file (%d is replaced by frame number if present)
* @param frame index of frame used for output (default: first frame = 0)
*
** @return true if successful, false otherwise
*/
int writePluginFormat(const DiPluginFormat *plugin,
const char *filename,
const unsigned long frame = 0);
protected:
/** constructor, create copy of given image object with different image data and photometric interpretation
*
** @param dicom source object to be copied
* @param image new image data
* @param interpret new photometric interpretation
*/
DicomImage(const DicomImage *dicom,
DiImage *image,
const EP_Interpretation interpret = EPI_Unknown);
/** initialize object.
* create internal image object depending on color model. is used for all 'real' constructors.
*/
void Init();
/** check whether data dictionary is present
*
** @return true if dictionary is present, false otherwise
*/
int checkDataDictionary();
/** get SOP class UID of current image object
*
** @return SOP class UID (or NULL if an error occurred)
*/
const char *getSOPclassUID() const;
/** normalize given degree value (for internal use).
* negative value are mapped to positive range (-360 -> 0, -270 -> 90, -180 -> 180, -90 -> 270),
* 360 is set to 0, all other values are rejected
*
** @param degree value to be normalized, valid values are: 0, 90, 180, 270
*
** @return true if successful, false otherwise (invalid value)
*/
int normalizeDegreeValue(signed int &degree) const;
private:
/// current state of converting progress (error level)
EI_Status ImageStatus;
/// DICOM color model (enumeration)
EP_Interpretation PhotometricInterpretation;
/// points to document object
DiDocument *Document;
/// points to image object
DiImage *Image;
// --- declarations to avoid compiler warnings
DicomImage(const DicomImage &);
DicomImage &operator=(const DicomImage &);
};
#endif