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

📄 dicoopxt.h

📁 转化为DIB位图再显示出来的dicom文件C++代码
💻 H
📖 第 1 页 / 共 2 页
字号:
                register unsigned long i;                const T2 max2 = OFstatic_cast(T2, DicomImageClass::maxval(bits2));                if (planar)                {                    register const T1 *p;                    if (bits1 == bits2)                    {                        for (int j = 0; j < 3; ++j)                        {                            p = pixel[j] + start;                            /* invert output data */                            if (inverse)                            {                                for (i = Count; i != 0; --i)                        // copy inverted data                                    *(q++) = max2 - OFstatic_cast(T2, *(p++));                            } else {                                for (i = Count; i != 0; --i)                        // copy                                    *(q++) = OFstatic_cast(T2, *(p++));                            }                            if (Count < FrameSize)                            {                                OFBitmanipTemplate<T2>::zeroMem(q, FrameSize - Count);  // set remaining pixels of frame to zero                                q += (FrameSize - Count);                            }                        }                    }                    else if (bits1 < bits2)                                     // optimization possible using LUT                    {                        const double gradient1 = OFstatic_cast(double, DicomImageClass::maxval(bits2)) /                                                 OFstatic_cast(double, DicomImageClass::maxval(bits1));                        const T2 gradient2 = OFstatic_cast(T2, gradient1);                        for (int j = 0; j < 3; ++j)                        {                            p = pixel[j] + start;                            if (gradient1 == OFstatic_cast(double, gradient2))  // integer multiplication?                            {                                /* invert output data */                                if (inverse)                                {                                    for (i = Count; i != 0; --i)                            // expand depth & invert                                        *(q++) = max2 - OFstatic_cast(T2, *(p++)) * gradient2;                                } else {                                    for (i = Count; i != 0; --i)                            // expand depth                                        *(q++) = OFstatic_cast(T2, *(p++)) * gradient2;                                }                            } else {                                /* invert output data */                                if (inverse)                                {                                    for (i = Count; i != 0; --i)                            // expand depth & invert                                        *(q++) = max2 - OFstatic_cast(T2, OFstatic_cast(double, *(p++)) * gradient1);                                } else {                                    for (i = Count; i != 0; --i)                            // expand depth                                        *(q++) = OFstatic_cast(T2, OFstatic_cast(double, *(p++)) * gradient1);                                }                            }                            if (Count < FrameSize)                            {                                OFBitmanipTemplate<T2>::zeroMem(q, FrameSize - Count);  // set remaining pixels of frame to zero                                q += (FrameSize - Count);                            }                        }                                                       // ... to be enhanced !                    }                    else /* bits1 > bits2 */                    {                        const int shift = bits1 - bits2;                        for (int j = 0; j < 3; ++j)                        {                            p = pixel[j] + start;                            /* invert output data */                            if (inverse)                            {                                for (i = Count; i != 0; --i)                            // reduce depth & invert                                    *(q++) = max2 - OFstatic_cast(T2, *(p++) >> shift);                            } else {                                for (i = Count; i != 0; --i)                            // reduce depth                                    *(q++) = OFstatic_cast(T2, *(p++) >> shift);                            }                            if (Count < FrameSize)                            {                                OFBitmanipTemplate<T2>::zeroMem(q, FrameSize - Count);  // set remaining pixels of frame to zero                                q += (FrameSize - Count);                            }                        }                    }                }                else /* not planar */                {                    register int j;                    if (bits1 == bits2)                    {                        /* invert output data */                        if (inverse)                        {                            for (i = start; i < start + Count; ++i)                                for (j = 0; j < 3; ++j)                         // copy inverted data                                    *(q++) = max2 - OFstatic_cast(T2, pixel[j][i]);                        } else {                            for (i = start; i < start + Count; ++i)                                for (j = 0; j < 3; ++j)                         // copy                                    *(q++) = OFstatic_cast(T2, pixel[j][i]);                        }                    }                    else if (bits1 < bits2)                                     // optimization possible using LUT                    {                        const double gradient1 = OFstatic_cast(double, DicomImageClass::maxval(bits2)) /                                                 OFstatic_cast(double, DicomImageClass::maxval(bits1));                        const T2 gradient2 = OFstatic_cast(T2, gradient1);                        if (gradient1 == OFstatic_cast(double, gradient2))      // integer multiplication?                        {                            /* invert output data */                            if (inverse)                            {                                for (i = start; i < start + Count; ++i)                 // expand depth & invert                                    for (j = 0; j < 3; ++j)                                        *(q++) = max2 - OFstatic_cast(T2, pixel[j][i]) * gradient2;                            } else {                                for (i = start; i < start + Count; ++i)                                    for (j = 0; j < 3; ++j)                             // expand depth                                        *(q++) = OFstatic_cast(T2, pixel[j][i]) * gradient2;                            }                        } else {                            /* invert output data */                            if (inverse)                            {                                for (i = start; i < start + Count; ++i)                                    for (j = 0; j < 3; ++j)                             // expand depth & invert                                        *(q++) = max2 - OFstatic_cast(T2, OFstatic_cast(double, pixel[j][i]) * gradient1);                            } else {                                for (i = start; i < start + Count; ++i)                                    for (j = 0; j < 3; ++j)                             // expand depth                                        *(q++) = OFstatic_cast(T2, OFstatic_cast(double, pixel[j][i]) * gradient1);                            }                        }                    }                    else /* bits1 > bits2 */                    {                        const int shift = bits1 - bits2;                        /* invert output data */                        if (inverse)                        {                            for (i = start; i < start + Count; ++i)                                for (j = 0; j < 3; ++j)                                 // reduce depth & invert                                    *(q++) = max2 - OFstatic_cast(T2, pixel[j][i] >> shift);                        } else {                            for (i = start; i < start + Count; ++i)                                for (j = 0; j < 3; ++j)                                 // reduce depth                                    *(q++) = OFstatic_cast(T2, pixel[j][i] >> shift);                        }                    }                    if (Count < FrameSize)                        OFBitmanipTemplate<T2>::zeroMem(q, 3 * (FrameSize - Count));  // set remaining pixels of frame to zero                }            }        } else            Data = NULL;    }    /// flag indicating whether the output data buffer should be deleted in the destructor    int DeleteData;    /// flag indicating whether pixel data is stored color-by-pixel or color-by-plane    int isPlanar; // --- declarations to avoid compiler warnings    DiColorOutputPixelTemplate(const DiColorOutputPixelTemplate<T1,T2> &);    DiColorOutputPixelTemplate<T1,T2> &operator=(const DiColorOutputPixelTemplate<T1,T2> &);};#endif/* * * CVS/RCS Log: * $Log: dicoopxt.h,v $ * Revision 1.24  2005/12/08 16:01:33  meichel * Changed include path schema for all DCMTK header files * * Revision 1.23  2004/02/06 11:18:18  joergr * Distinguish more clearly between const and non-const access to pixel data. * * Revision 1.22  2003/12/23 16:06:21  joergr * Replaced additional post-increment/decrement operators by pre-increment/ * decrement operators. * * Revision 1.21  2003/12/23 11:36:24  joergr * Adapted type casts to new-style typecast operators defined in ofcast.h. * Removed leading underscore characters from preprocessor symbols (reserved * symbols). Updated copyright header. * Replaced post-increment/decrement operators by pre-increment/decrement * operators where appropriate (e.g. 'i++' by '++i'). * * Revision 1.20  2002/06/26 17:20:31  joergr * Added type cast to keep MSVC6 quiet. * * Revision 1.19  2002/06/26 16:17:16  joergr * Added support for polarity flag to color images. * * Revision 1.18  2001/11/09 16:42:04  joergr * Removed 'inline' specifier from certain methods. * * Revision 1.17  2001/06/01 15:49:29  meichel * Updated copyright header * * Revision 1.16  2000/03/30 14:15:44  joergr * Corrected wrong bit expansion of output pixel data (left shift is not * correct). * * Revision 1.15  2000/03/08 16:21:50  meichel * Updated copyright header. * * Revision 1.14  1999/09/17 14:03:43  joergr * Enhanced efficiency of some "for" loops. * * Revision 1.13  1999/08/17 10:28:47  joergr * Commented unused parameter name to avoid compiler warnings. * Removed unused parameter. * * Revision 1.12  1999/07/23 13:20:45  joergr * Enhanced handling of corrupted pixel data (wrong length). * * Revision 1.11  1999/04/30 16:12:03  meichel * Minor code purifications to keep IBM xlC quiet * * Revision 1.10  1999/04/29 09:31:13  joergr * Moved color related image files back to non-public part. * * Revision 1.1  1999/04/28 14:57:31  joergr * Moved files from dcmimage module to dcmimgle to support new pastel color * output format. * * Revision 1.8  1999/01/20 14:43:12  joergr * Replaced invocation of getCount() by member variable Count where possible. * Added new output method to fill external memory buffer with rendered pixel * data. * * Revision 1.7  1998/12/22 13:23:57  joergr * Added comments that the routines for expanding pixel's depth have to be * enhanced in the future (replicate bit pattern instead of shifting). Same * question for reducing depth. * * Revision 1.6  1998/11/27 13:46:00  joergr * Added copyright message. Replaced delete by delete[] for array types. * * Revision 1.5  1998/07/01 08:39:19  joergr * Minor changes to avoid compiler warnings (gcc 2.8.1 with additional * options), e.g. add copy constructors. * * Revision 1.4  1998/05/11 14:53:12  joergr * Added CVS/RCS header to each file. * * */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -