提供两种参考实现办法,
做法一: 按照你目前的设计,第一次在 16-bit 原图里做 window-level,以后所有作业都在 BMP/DIB 里做。调窗时只改 BMP 里的 palette 而不变密度值和图形。示意码:
void CMyViewer: rawImage(CMyBmp &oneImage, CDC *pDC)
{
// Please set m_nPalWindow to 255 and m_nPalCenter to 128
// when the new BMP is generated from the original DICOM image
// with 16-bit (default) window-leveling
if ((m_nPalWindow != 255) && ((m_nPalCenter != 128))
oneImage.WindowLevelBMPPalette(m_nPalWindow, m_nPalCenter)"
oneImage.Draw(pDC)"
}
做法二: 每次调窗时产生新的 BMP。 改写你的 draw function。反白、平滑、翻转、放大、平移等等全部用参数记下来,有些要累积起来。每次图刷新的时候都要重新处理。示意码:
void CMyViewer: rawImage(CMyBmp &oneImage, CDC *pDC)
{
...
CMyBmp ImageObj = oneImage" // Make a copy of the BMP image
if (m_bInvert)
ImageObj.Invert()" // 反白
if (m_eFlip != FLIP_NONE) // 翻转
ImageObj.Flip(m_eFlip)
if ((m_nRotate != 0) && (m_nRotate != 360)) // 旋转
ImageObj.Rotate(m_nRotate)
if (m_eSmoothAlgorithm != SMOOTH_NONE)
ImageObj.Smooth(m_eSmoothAlgorithm )" // 平滑
if (m_dZoom != 1.0)
ImageObj.Zoom(m_dZoom)" // 放大
ImageObj.Draw(pDC)"
}
鉴于目前的计算机速度(之快),我建议用后一种方案。
|