📄 dicoopxt.h
字号:
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 + -