void CProcessCommDlg::OnBnClickedButtonDcm()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
DcmFileFormat fileformat;
DcmDataset *pDataset = fileformat.getDataset();
CString strRawPath, strDCMPath, strTmp;
strRawPath.Format("D:\\TestImg\\%d.raw",g_imgNum);
strDCMPath.Format("D:\\TestImg\\%d.dcm", g_imgNum);
//OFCondition oc = fileformat.loadFile(strRawPath);
int imgSize = m_nImgWidth*m_nImgWidth * 2;
BYTE *pRaw = nullptr;
try
{
pRaw= new BYTE[imgSize];
memset(pRaw, 0, imgSize);
//delete[]pRaw;
FILE*fp = fopen(strRawPath,"r");
if (fp == NULL)
{
delete[]pRaw;
return;
}
fread(pRaw,sizeof(BYTE),imgSize,fp);
fclose(fp);
SetDlgItemText(IDC_STATIC_STATA, "文件写完");
}
catch (CMemoryException* e)
{
CString strErr;
e->GetErrorMessage(strErr.GetBuffer(MAX_PATH), MAX_PATH, 0);
AfxMessageBox(strErr);
strErr.ReleaseBuffer();
return;
}
//if (oc.good())
{
OFString strTagValue;
AddDcmElements(pDataset);
// 新名字
if (fileformat.getDataset()->putAndInsertString(DCM_PatientName, "John Doe").good())
{
fileformat.getDataset()->findAndGetOFString(DCM_PatientName, strTagValue);
cout << "Patient New Name:" << strTagValue.data() << endl;
}
// 修改窗宽窗位
if (fileformat.getDataset()->putAndInsertString(DCM_WindowCenter, "30000").good())
{
fileformat.getDataset()->findAndGetOFString(DCM_WindowCenter, strTagValue);
cout << "窗位:" << strTagValue.data() << endl;
}
if (fileformat.getDataset()->putAndInsertString(DCM_WindowWidth, "60000").good())
{
fileformat.getDataset()->findAndGetOFString(DCM_WindowCenter, strTagValue);
cout << "窗宽:" << strTagValue.data() << endl;
}
// 修改宽高
if (fileformat.getDataset()->putAndInsertString(DCM_Rows, "3072").good())
{
fileformat.getDataset()->findAndGetOFString(DCM_Rows, strTagValue);
cout << "Rows:" << strTagValue.data() << endl;
}
if (fileformat.getDataset()->putAndInsertString(DCM_Columns, "3072").good())
{
fileformat.getDataset()->findAndGetOFString(DCM_Columns, strTagValue);
cout << "Columns:" << strTagValue.data() << endl;
}
// 保存新的dcm
OFCondition status = pDataset->putAndInsertUint8Array(DCM_PixelData, (Uint8 *)pRaw, imgSize, true);
if (status.good())
{
strTmp.Format("%s", status.text());
AfxMessageBox(strTmp);
status = fileformat.saveFile(strDCMPath, EXS_LittleEndianExplicit);
//status = fileformat.saveFile(strDCMPath, EXS_JPEGProcess14SV1TransferSyntax);
if (status.bad())
{
strTmp.Format("DCM file create failed,%s", status.text());
AfxMessageBox(strTmp);
}
}
else
{
strTmp.Format("putAndInsertUint8Array error,%s", status.text());
AfxMessageBox(strTmp);
}
}
delete[]pRaw;
}
这段代码是什么意思啊,有写看不懂
1.有些是从网上复制的,不合用的加上了//;
2.大致逻辑是,从本地硬盘读取raw格式图像(我定义的尺寸是20000*20000*2),;
3.通过DCMTK接口,编辑头信息AddDcmElements(pDataset);是从网上copy的;
4.putAndInsertUint8Array()运行报错,virtual memory exhaust(内存耗尽),不太明白原因,但是当我将raw图像的尺寸定义成3072*3072*2时,是可以的,能正常生成DCM图像