📄 diybrpxt.h
字号:
/* * * Copyright (C) 1998-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: dcmimage * * Author: Joerg Riesmeier * * Purpose: DicomYBRPixelTemplate (Header) * * Last Update: $Author: meichel $ * Update Date: $Date: 2005/12/08 16:02:01 $ * CVS/RCS Revision: $Revision: 1.17 $ * Status: $State: Exp $ * * CVS/RCS Log at end of file * */#ifndef DIYBRPXT_H#define DIYBRPXT_H#include "dcmtk/config/osconfig.h"#include "dcmtk/dcmimage/dicopxt.h"#include "dcmtk/dcmimgle/dipxrept.h"#include "dcmtk/dcmimgle/diinpx.h" /* gcc 3.4 needs this *//*---------------------* * class declaration * *---------------------*//** Template class to handle YCbCr pixel data */template<class T1, class T2>class DiYBRPixelTemplate : public DiColorPixelTemplate<T2>{ public: /** constructor * ** @param docu pointer to DICOM document * @param pixel pointer to input pixel representation * @param status reference to status variable * @param planeSize number of pixels in a plane * @param bits number of bits per sample * @param rgb flag, convert color model to RGB only if true */ DiYBRPixelTemplate(const DiDocument *docu, const DiInputPixel *pixel, EI_Status &status, const unsigned long planeSize, const int bits, const OFBool rgb) : DiColorPixelTemplate<T2>(docu, pixel, 3, status) { if ((pixel != NULL) && (this->Count > 0) && (status == EIS_Normal)) convert(OFstatic_cast(const T1 *, pixel->getData()) + pixel->getPixelStart(), planeSize, bits, rgb); } /** destructor */ virtual ~DiYBRPixelTemplate() { } private: /** convert input pixel data to intermediate representation * ** @param pixel pointer to input pixel data * @param planeSize number of pixels in a plane * @param bits number of bits per sample * @param rgb flag, convert color model to RGB only if true */ void convert(const T1 *pixel, const unsigned long planeSize, const int bits, const OFBool rgb) { if (Init(pixel)) { const T1 offset = OFstatic_cast(T1, DicomImageClass::maxval(bits - 1)); // use the number of input pixels derived from the length of the 'PixelData' // attribute), but not more than the size of the intermediate buffer const unsigned long count = (this->InputCount < this->Count) ? this->InputCount : this->Count; if (rgb) /* convert to RGB model */ { register T2 *r = this->Data[0]; register T2 *g = this->Data[1]; register T2 *b = this->Data[2]; const T2 maxvalue = OFstatic_cast(T2, DicomImageClass::maxval(bits)); DiPixelRepresentationTemplate<T1> rep; if (bits == 8 && !rep.isSigned()) // only for unsigned 8 bit { Sint16 rcr_tab[256]; Sint16 gcb_tab[256]; Sint16 gcr_tab[256]; Sint16 bcb_tab[256]; const double r_const = 0.7010 * OFstatic_cast(double, maxvalue); const double g_const = 0.5291 * OFstatic_cast(double, maxvalue); const double b_const = 0.8859 * OFstatic_cast(double, maxvalue); register unsigned long l; for (l = 0; l < 256; ++l) { rcr_tab[l] = OFstatic_cast(Sint16, 1.4020 * OFstatic_cast(double, l) - r_const); gcb_tab[l] = OFstatic_cast(Sint16, 0.3441 * OFstatic_cast(double, l)); gcr_tab[l] = OFstatic_cast(Sint16, 0.7141 * OFstatic_cast(double, l) - g_const); bcb_tab[l] = OFstatic_cast(Sint16, 1.7720 * OFstatic_cast(double, l) - b_const); } register Sint32 sr; register Sint32 sg; register Sint32 sb; if (this->PlanarConfiguration) {/* register const T1 *y = pixel; register const T1 *cb = y + this->InputCount; register const T1 *cr = cb + this->InputCount; for (i = count; i != 0; --i, ++y, ++cb, ++cr) { sr = OFstatic_cast(Sint32, *y) + OFstatic_cast(Sint32, rcr_tab[*cr]); sg = OFstatic_cast(Sint32, *y) - OFstatic_cast(Sint32, gcb_tab[*cb]) - OFstatic_cast(Sint32, gcr_tab[*cr]); sb = OFstatic_cast(Sint32, *y) + OFstatic_cast(Sint32, bcb_tab[*cb]); *(r++) = (sr < 0) ? 0 : (sr > OFstatic_cast(Sint32, maxvalue)) ? maxvalue : OFstatic_cast(T2, sr); *(g++) = (sg < 0) ? 0 : (sg > OFstatic_cast(Sint32, maxvalue)) ? maxvalue : OFstatic_cast(T2, sg); *(b++) = (sb < 0) ? 0 : (sb > OFstatic_cast(Sint32, maxvalue)) ? maxvalue : OFstatic_cast(T2, sb); }*/ register const T1 *y = pixel; register const T1 *cb = y + planeSize; register const T1 *cr = cb + planeSize; register unsigned long i = count; while (i != 0) { /* convert a single frame */ for (l = planeSize; (l != 0) && (i != 0); --l, --i, ++y, ++cb, ++cr) { sr = OFstatic_cast(Sint32, *y) + OFstatic_cast(Sint32, rcr_tab[OFstatic_cast(Uint32, *cr)]); sg = OFstatic_cast(Sint32, *y) - OFstatic_cast(Sint32, gcb_tab[OFstatic_cast(Uint32, *cb)]) - OFstatic_cast(Sint32, gcr_tab[OFstatic_cast(Uint32, *cr)]); sb = OFstatic_cast(Sint32, *y) + OFstatic_cast(Sint32, bcb_tab[OFstatic_cast(Uint32, *cb)]); *(r++) = (sr < 0) ? 0 : (sr > OFstatic_cast(Sint32, maxvalue)) ? maxvalue : OFstatic_cast(T2, sr); *(g++) = (sg < 0) ? 0 : (sg > OFstatic_cast(Sint32, maxvalue)) ? maxvalue : OFstatic_cast(T2, sg); *(b++) = (sb < 0) ? 0 : (sb > OFstatic_cast(Sint32, maxvalue)) ? maxvalue : OFstatic_cast(T2, sb); } /* jump to next frame start (skip 2 planes) */ y += 2 * planeSize; cb += 2 * planeSize; cr += 2 * planeSize; } } else { register const T1 *p = pixel; register T1 y; register T1 cb; register T1 cr; register unsigned long i; for (i = count; i != 0; --i) { y = *(p++); cb = *(p++); cr = *(p++);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -