⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diinpxt.h

📁 转化为DIB位图再显示出来的dicom文件C++代码
💻 H
📖 第 1 页 / 共 2 页
字号:
/* * *  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 + -