📄 diinpxt.h
字号:
/* * * Copyright (C) 1996-2005, OFFIS * * This software and supporting documentation were developed by * * Kuratorium OFFIS e.V. * Healthcare Information and Communication Systems * Escherweg 2 * D-26121 Oldenburg, Germany * * THIS SOFTWARE IS MADE AVAILABLE, AS IS, AND OFFIS MAKES NO WARRANTY * REGARDING THE SOFTWARE, ITS PERFORMANCE, ITS MERCHANTABILITY OR * FITNESS FOR ANY PARTICULAR USE, FREEDOM FROM ANY COMPUTER DISEASES OR * ITS CONFORMITY TO ANY SPECIFICATION. THE ENTIRE RISK AS TO QUALITY AND * PERFORMANCE OF THE SOFTWARE IS WITH THE USER. * * Module: dcmimgle * * Author: Joerg Riesmeier * * Purpose: DicomInputPixelTemplate (Header) * * Last Update: $Author: meichel $ * Update Date: $Date: 2005/12/08 16:47:44 $ * CVS/RCS Revision: $Revision: 1.30 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */#ifndef DIINPXT_H#define DIINPXT_H#include "dcmtk/config/osconfig.h"#include "dcmtk/dcmdata/dctypes.h"#include "dcmtk/dcmdata/dcpixel.h"#include "dcmtk/ofstd/ofbmanip.h"#include "dcmtk/ofstd/ofcast.h"#include "dcmtk/dcmimgle/diinpx.h"#include "dcmtk/dcmimgle/dipxrept.h"#include "dcmtk/dcmimgle/diutils.h"/*--------------------* * helper functions * *--------------------*/static inline Uint8 expandSign(const Uint8 Value, const Uint8, const Uint8){ return Value;}static inline Uint16 expandSign(const Uint16 Value, const Uint16, const Uint16){ return Value;}static inline Uint32 expandSign(const Uint32 Value, const Uint32, const Uint32){ return Value;}static inline Sint8 expandSign(const Sint8 Value, const Sint8 SignBit, const Sint8 SignMask){ return (Value & SignBit) ? (Value | SignMask) : Value;}static inline Sint16 expandSign(const Sint16 Value, const Sint16 SignBit, const Sint16 SignMask){ return (Value & SignBit) ? (Value | SignMask) : Value;}static inline Sint32 expandSign(const Sint32 Value, const Sint32 SignBit, const Sint32 SignMask){ return (Value & SignBit) ? (Value | SignMask) : Value;}static Uint32 getPixelData(DcmPixelData *PixelData, Uint8 *&pixel){ PixelData->getUint8Array(pixel); return PixelData->getLength();}static Uint32 getPixelData(DcmPixelData *PixelData, Uint16 *&pixel){ PixelData->getUint16Array(pixel); return PixelData->getLength();}/*---------------------* * class declaration * *---------------------*//** Template class to convert DICOM pixel stream to intermediate representation */template<class T1, class T2>class DiInputPixelTemplate : public DiInputPixel, public DiPixelRepresentationTemplate<T2>{ public: /** constructor * ** @param pixel pointer to DICOM dataset element containing the pixel data * @param alloc number of bits allocated for each pixel * @param stored number of bits stored for each pixel * @param high position of bigh bit within bits allocated * @param start start position of pixel data to be processed * @param count number of pixels to be processed */ DiInputPixelTemplate(/*const*/ DcmPixelData *pixel, const Uint16 alloc, const Uint16 stored, const Uint16 high, const unsigned long start, const unsigned long count) : DiInputPixel(stored, start, count), Data(NULL) { MinValue[0] = 0; MinValue[1] = 0; MaxValue[0] = 0; MaxValue[1] = 0; if (this->isSigned()) { AbsMinimum = -OFstatic_cast(double, DicomImageClass::maxval(Bits - 1, 0)); AbsMaximum = OFstatic_cast(double, DicomImageClass::maxval(Bits - 1)); } else { AbsMinimum = 0; AbsMaximum = OFstatic_cast(double, DicomImageClass::maxval(Bits)); } if (pixel != NULL) convert(pixel, alloc, stored, high); if ((PixelCount == 0) || (PixelStart + PixelCount > Count)) // check for corrupt pixel length PixelCount = Count - PixelStart; } /** destructor */ virtual ~DiInputPixelTemplate() { delete[] Data; } /** determine minimum and maximum pixel value * ** @return status, true if successful, false otherwise */ int determineMinMax() { if (Data != NULL) { register T2 *p = Data; register unsigned long i; const unsigned long ocnt = OFstatic_cast(unsigned long, getAbsMaxRange()); Uint8 *lut = NULL; if ((sizeof(T2) <= 2) && (Count > 3 * ocnt)) // optimization criteria { lut = new Uint8[ocnt]; if (lut != NULL) { OFBitmanipTemplate<Uint8>::zeroMem(lut, ocnt); register Uint8 *q = lut - OFstatic_cast(T2, getAbsMinimum()); for (i = Count; i != 0; --i) // fill lookup table *(q + *(p++)) = 1; q = lut; for (i = 0; i < ocnt; ++i) // search for minimum { if (*(q++) != 0) { MinValue[0] = OFstatic_cast(T2, OFstatic_cast(double, i) + getAbsMinimum()); break; } } q = lut + ocnt; for (i = ocnt; i != 0; --i) // search for maximum { if (*(--q) != 0) { MaxValue[0] = OFstatic_cast(T2, OFstatic_cast(double, i - 1) + getAbsMinimum()); break; } } if (Count >= PixelCount) // use global min/max value { MinValue[1] = MinValue[0]; MaxValue[1] = MaxValue[0]; } else { // calculate min/max for selected range OFBitmanipTemplate<Uint8>::zeroMem(lut, ocnt); p = Data + PixelStart; q = lut - OFstatic_cast(T2, getAbsMinimum()); for (i = PixelCount; i != 0; --i) // fill lookup table *(q + *(p++)) = 1; q = lut; for (i = 0; i < ocnt; ++i) // search for minimum { if (*(q++) != 0) { MinValue[1] = OFstatic_cast(T2, OFstatic_cast(double, i) + getAbsMinimum()); break; } } q = lut + ocnt; for (i = ocnt; i != 0; --i) // search for maximum { if (*(--q) != 0) { MaxValue[1] = OFstatic_cast(T2, OFstatic_cast(double, i - 1) + getAbsMinimum()); break; } } } } } if (lut == NULL) // use conventional method { register T2 value = *p; MinValue[0] = value; MaxValue[0] = value; for (i = Count; i > 1; --i) { value = *(++p); if (value < MinValue[0]) MinValue[0] = value; else if (value > MaxValue[0]) MaxValue[0] = value; } if (Count <= PixelCount) // use global min/max value { MinValue[1] = MinValue[0]; MaxValue[1] = MaxValue[0]; } else { // calculate min/max for selected range p = Data + PixelStart; value = *p; MinValue[1] = value; MaxValue[1] = value; for (i = PixelCount; i > 1; --i) { value = *(++p); if (value < MinValue[1]) MinValue[1] = value; else if (value > MaxValue[1]) MaxValue[1] = value; } } } delete[] lut; return 1; } return 0; } /** get pixel representation * ** @return pixel representation */ inline EP_Representation getRepresentation() const { return DiPixelRepresentationTemplate<T2>::getRepresentation(); } /** get pointer to input pixel data * ** @return pointer to input pixel data */ inline const void *getData() const { return OFstatic_cast(const void *, Data); } /** get reference to pointer to input pixel data * ** @return reference to pointer to input pixel data */ virtual void *getDataPtr() { return OFstatic_cast(void *, Data); } /** remove reference to (internally handled) pixel data */ inline void removeDataReference() { Data = NULL; } /** get minimum pixel value * ** @param idx specifies whether to return the global minimum (0) or * the minimum of the selected pixel range (1, see PixelStart/Range) * ** @return minimum pixel value */ inline double getMinValue(const int idx) const { return (idx == 0) ? OFstatic_cast(double, MinValue[0]) : OFstatic_cast(double, MinValue[1]); } /** get maximum pixel value * ** @param idx specifies whether to return the global maximum (0) or * the maximum of the selected pixel range (1, see PixelStart/Range) * ** @return maximum pixel value */ inline double getMaxValue(const int idx) const { return (idx == 0) ? OFstatic_cast(double, MaxValue[0]) : OFstatic_cast(double, MaxValue[1]); } private: /** convert pixel data from DICOM dataset to input representation * ** @param pixelData pointer to DICOM dataset element containing the pixel data * @param bitsAllocated number of bits allocated for each pixel * @param bitsStored number of bits stored for each pixel * @param highBit position of bigh bit within bits allocated */ void convert(/*const*/ DcmPixelData *pixelData, const Uint16 bitsAllocated, const Uint16 bitsStored, const Uint16 highBit) { const Uint16 bitsof_T1 = bitsof(T1); const Uint16 bitsof_T2 = bitsof(T2); T1 *pixel; const Uint32 length_Bytes = getPixelData(pixelData, pixel); const Uint32 length_T1 = length_Bytes / sizeof(T1); Count = ((length_Bytes * 8) + bitsAllocated - 1) / bitsAllocated;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -