16,472
社区成员
发帖
与我相关
我的任务
分享
void Cdicomtest1Doc::Serialize(CArchive& ar)
{
CFile *pFile;
pFile=ar.GetFile();
CString m_FileName=pFile->GetFilePath();
CString filetype=m_FileName.Right(3);
if(filetype=="dcm")
{
CObject::Serialize(ar);
m_pDicom=new CDicom();
m_pDicom->LoadFile(m_FileName);
}
else
{
m_pDib->Serialize(ar);
}
if (ar.IsStoring())
{
// TODO: 在此添加存储代码
}
else
{
// TODO: 在此添加加载代码
}
}
BOOL Cdicomtest1Doc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
CString strPath =(CString)lpszPathName;
CString filetype=strPath.Right(3);
if(filetype=="dcm")
{
m_pDicom=new CDicom();
m_pDicom->LoadFile(lpszPathName);
}
return TRUE;
}
BOOL CDicom::LoadFile(const char *fileName)
{
//通过DCMTK打开文件
OFCondition Fcond=pDicomFile->loadFile(fileName);
if(Fcond.good())
{
DcmDataset* pDataset=pDicomFile->getDataset();
E_TransferSyntax xfer=pDataset->getOriginalXfer();
pDicomImg=new DicomImage((DcmObject*)pDataset,xfer,(const unsigned long)0,(const unsigned long)0,(const unsigned long)0);
m_pDib->BuildDIB(pDicomImg);
return TRUE;
}
else
{
return false;
}
}
BOOL CDib::BuildDIB(DicomImage* pBuildDicomImg)
{
void* pDicomDibits;
//产生DIB结构数据区,iDataSize指向生成的数据区,后面的参数为表示产生第一帧的8位的dib位图。
unsigned long iDataSize=pBuildDicomImg->createWindowsDIB(pDicomDibits,0,0,8,1,1);
if(iDataSize==0)
{
MessageBox(NULL,"文件无法通过DCMTK读取","提示",MB_OK);
return FALSE;
}
/*创建DIB*/
//定义BITMAPINFO
//定义BITMAPINFOHEADER
BITMAPINFOHEADER BitmapInfoHeader;
BitmapInfoHeader.biBitCount=8;
BitmapInfoHeader.biClrImportant=0;
BitmapInfoHeader.biClrUsed=256;
BitmapInfoHeader.biCompression=BI_RGB;
BitmapInfoHeader.biPlanes=1;
BitmapInfoHeader.biHeight=pBuildDicomImg->getHeight();//得到图像的高度
BitmapInfoHeader.biWidth=pBuildDicomImg->getWidth();//得到图像的宽度
BitmapInfoHeader.biXPelsPerMeter=0;
BitmapInfoHeader.biYPelsPerMeter=0;
BitmapInfoHeader.biSize=sizeof(BITMAPINFOHEADER);
BitmapInfoHeader.biSizeImage=((((pBuildDicomImg->getWidth() * 8) + 31) & ~31) >> 3) * pBuildDicomImg->getHeight();
//定义RGBQUAD
RGBQUAD pColorTable[256];
for(int i=0;i<256;i++)
{
pColorTable[i].rgbBlue=i;
pColorTable[i].rgbGreen=i;
pColorTable[i].rgbRed=i;
pColorTable[i].rgbReserved=0;
}
//为DIB位图分配内存
char* p=new char[sizeof(BITMAPINFOHEADER)+256*4+iDataSize];
memcpy(p,&BitmapInfoHeader,sizeof(BITMAPINFOHEADER));
memcpy(p+sizeof(BITMAPINFOHEADER),pColorTable,1024);
memcpy(p+sizeof(BITMAPINFOHEADER)+1024,pDicomDibits,iDataSize);
LPBITMAPINFOHEADER lpbi=(LPBITMAPINFOHEADER)p;
BOOL bSuccess = Create((LPBYTE)lpbi);
delete []p;
delete pDicomDibits;
return bSuccess;
}