dicom 图像动态调整center with

void CMyDicomViewerView::OnMouseMove(UINT nFlags, CPoint point)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
 if(beginX != 0 && beginY != 0)
 {
  int xCount = point.x - beginX;
  int yCount = point.y - beginY;

  if(abs(xCount) > 10 || abs(yCount) > 10)
  {
   beginX = point.x;
   beginY = point.y;

   CFrameWnd * mainFrame = (CFrameWnd *)AfxGetMainWnd();
   if(!mainFrame)
   {
    return;
   }

BOOL CMyDicomViewerDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
 if (!CDocument::OnOpenDocument(lpszPathName))
  return FALSE;

 DcmFileFormat dfile;
 OFCondition cond = dfile.loadFile(lpszPathName);
    if (cond.bad()) {
        AfxMessageBox(_T("上传文件有问题,请联系管理人员!"));
  return FALSE;
    }

 m_dcmDataset = dfile.getDataset();

 E_TransferSyntax xfer = m_dcmDataset ->getOriginalXfer();
 di = new DicomImage(m_dcmDataset,xfer,CIF_AcrNemaCompatibility,1,2);

 return MakeFile();
}

bool CMyDicomViewerDoc::MakeFile()
{
 if(m_newCenter == 0 && m_newWidth == 0)
 {
  di->setHistogramWindow();

  di->getWindow(m_defaultCenter,m_defaultWidth);
  double minV = 0, maxV = 0;
  double windowW = 0, windowC = 0;
  
  DcmTagKey tagKeyC(0x0028, 0x1050);
  DcmTagKey tagKeyW(0x0028, 0x1051);

  const char * ww = NULL, * wc = NULL;
  m_dcmDataset->findAndGetString(tagKeyC, wc, TRUE);
  m_dcmDataset->findAndGetString(tagKeyW, ww, TRUE);
  if(ww)
  {
   windowW = atol(ww);
  }
  if(wc)
  {
   windowC = atol(wc);
  }
  if(windowW == 0 && windowC == 0)
  {
   di->getMinMaxValues(minV, maxV, 0);
   windowW = maxV - minV;
   windowC = minV + ((long)windowW >> 1);
  }
  m_defaultCenter = windowC;
  m_defaultWidth = windowW;
  di->setWindow(m_defaultCenter,m_defaultWidth);
 }else
 {
  di->setWindow(m_newCenter,m_newWidth);
 }

 DicomImage * dinow;

 if(m_newfactor != 0)
 {
  dinow = di->createScaledImage(m_newfactor,0,1,1);
 }else
 {
  if(di->getWidth() < 775)
  {
   dinow = di->createScaledImage((double)1,0,1,1);
  }else
  {
   dinow = di->createScaledImage((const unsigned long)650,0,1,1);
  }
 }

 if(dinow==NULL)
 {
  AfxMessageBox(_T("此DICOM图内没有图片,打开失败!"));
  return FALSE;
 }
   
    if (dinow->getStatus() != EIS_Normal)
 {
  AfxMessageBox(DicomImage::getString(dinow->getStatus()));
  return FALSE;
 }

 unsigned long fCount = dinow->getFrameCount();

 m_images->RemoveAll();

 for(unsigned long i = 0;i<fCount;i++)
 {
  ImageInfo* info = new ImageInfo;
  void * bufferpic;
  dinow->createWindowsDIB(bufferpic,0,0,24,1,1);
  info->image = bufferpic;

  BITMAPINFO m_bmiCurrentImage;
  SIZE_T size = sizeof(m_bmiCurrentImage);
  memset(&m_bmiCurrentImage, 0, size);
  m_bmiCurrentImage.bmiHeader.biSize = sizeof(m_bmiCurrentImage.bmiHeader);
  m_bmiCurrentImage.bmiHeader.biWidth = dinow->getWidth();;
  m_bmiCurrentImage.bmiHeader.biHeight = dinow->getHeight();;
  m_bmiCurrentImage.bmiHeader.biPlanes = 1;
  m_bmiCurrentImage.bmiHeader.biBitCount = 24;
  m_bmiCurrentImage.bmiHeader.biCompression = BI_RGB;
  info->header = m_bmiCurrentImage;
  m_images->AddTail(*info);
  memset(&m_bmiCurrentImage, 0, size);
  info = NULL;
 }

 delete dinow;
 dinow = NULL;

 return TRUE;
}


   CFrameWnd * subFrame = (CFrameWnd *)mainFrame->GetActiveFrame();
   if(!subFrame)
   {
    return;
   }
   CDocument * activeDoc = subFrame->GetActiveDocument();
   if(!activeDoc)
   {
    return;
   }
   if(activeDoc->IsKindOf(RUNTIME_CLASS(CMyDicomViewerDoc)))
   {
    CMyDicomViewerDoc * mydoc = ((CMyDicomViewerDoc *)activeDoc);
    if(mydoc->m_newCenter == 0 && mydoc->m_newWidth == 0)
    {
     mydoc->m_newCenter = mydoc->m_defaultCenter + xCount*10;
     mydoc->m_newWidth = mydoc->m_defaultWidth + yCount*10;
    }else
    {
     mydoc->m_newCenter += xCount*10;
     mydoc->m_newWidth += yCount*10;
    }
    mydoc->MakeFile();
    activeDoc->UpdateAllViews(NULL);
   }
  }
 }
 CScrollView::OnMouseMove(nFlags, point);

      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值