X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=libctsim%2Fctndicom.cpp;h=2209fba2706e40236729782e5dfcaac15a53edad;hp=36dbeb162e7ad295949b45ef566226ff06bf7065;hb=663448e3173a19f054952806d8f8eca2fe59ec90;hpb=4cdd078f0f198a00e8037e6edec0eb30a6861bae diff --git a/libctsim/ctndicom.cpp b/libctsim/ctndicom.cpp index 36dbeb1..2209fba 100644 --- a/libctsim/ctndicom.cpp +++ b/libctsim/ctndicom.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: ctndicom.cpp,v 1.7 2001/03/07 16:34:47 kevin Exp $ +** $Id: ctndicom.cpp,v 1.12 2001/03/13 14:53:44 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -37,7 +37,7 @@ DicomImporter::DicomImporter (const char* const pszFile) - : m_strFilename(pszFile), m_bFail(false), m_iContents(DICOM_CONTENTS_INVALID), + : m_pFile(NULL), m_strFilename(pszFile), m_bFail(false), m_iContents(DICOM_CONTENTS_INVALID), m_pImageFile(NULL), m_pProjections(NULL) { unsigned long lOptions = DCM_ORDERLITTLEENDIAN; @@ -154,7 +154,7 @@ DicomImporter::loadImage(unsigned short iNRows, unsigned short iNCols, unsigned if (iMaskLength > 8) iMaskLength -= 8; unsigned int iMask = (1 << iMaskLength) - 1; - for (int iy = iNRows - 1; iy >= 0; iy--) { + for (int iy = 0; iy < iNRows; iy++) { for (int ix = 0; ix < iNCols; ix++) { if (iBitsAllocated == 8) { unsigned char cV = pRawPixels[iy * iNRows + ix]; @@ -164,7 +164,7 @@ DicomImporter::loadImage(unsigned short iNRows, unsigned short iNCols, unsigned unsigned char cV1 = pRawPixels[lBase]; unsigned char cV2 = pRawPixels[lBase+1] & iMask; int iV = cV1 + (cV2 << 8); - v[ix][iy] = iV * dRescaleSlope + dRescaleIntercept; + v[ix][iNRows - 1 - iy] = iV * dRescaleSlope + dRescaleIntercept; } } } @@ -284,13 +284,14 @@ DicomExporter::createDicomObject() dWidth = 1E-7; double dScale = 65535. / dWidth; - double dRescaleIntercept = -dMin; + double dRescaleIntercept = dMin; double dRescaleSlope = 1 / dScale; char szRescaleIntercept[17]; char szRescaleSlope[17]; snprintf (szRescaleIntercept, sizeof(szRescaleIntercept), "%e", dRescaleIntercept); snprintf (szRescaleSlope, sizeof(szRescaleIntercept), "%e", dRescaleSlope); + char szCTSimRoot[] = "1.2.826.0.1.3680043.2.284."; char szModality[] = "CT"; char szSOPClassUID[65] = "1.2.840.10008.5.4.1.1.2"; char szImgPhotometricInterp[] = "MONOCHROME2"; @@ -300,17 +301,17 @@ DicomExporter::createDicomObject() char szAcqKvp[] = "0"; char szRelAcquisitionNumber[] = "1"; char szRelImageNumber[] = "1"; - char szIDSOPInstanceUID[] = ""; + char szIDSOPInstanceUID[65] = ""; char szIDManufacturer[] = "CTSim"; char szRelPositionRefIndicator[] = "0"; - char szRelFrameOfReferenceUID[] = ""; + char szRelFrameOfReferenceUID[65] = ""; char szRelSeriesNumber[] = "1"; char szIDAccessionNumber[] = "0"; char szRelStudyID[] = "1"; char szIDReferringPhysician[] = "NONE"; char szIDStudyTime[] = "000000.0"; char szIDStudyDate[] = "00000000"; - char szRelStudyInstanceUID[] = ""; + char szRelStudyInstanceUID[65] = ""; char szPatSex[] = "O"; char szPatBirthdate[] = "0000000"; char szPatID[] = "NONE"; @@ -318,6 +319,15 @@ DicomExporter::createDicomObject() char szIDImageType[] = "ORIGINAL"; char szIDManufacturerModel[65] = ""; + std::ostringstream osPatComments; + m_pImageFile->printLabelsBrief (osPatComments); + size_t sizePatComments = osPatComments.str().length(); + char* pszPatComments = new char [sizePatComments+1]; + strncpy (pszPatComments, osPatComments.str().c_str(), sizePatComments); + + snprintf (szIDSOPInstanceUID, sizeof(szIDSOPInstanceUID), "%s.2.1.6.1", szCTSimRoot); + snprintf (szRelStudyInstanceUID, sizeof(szRelStudyInstanceUID), "%s.2.1.6.1.1", szCTSimRoot); + snprintf (szRelFrameOfReferenceUID, sizeof(szRelFrameOfReferenceUID), "%s.99", szCTSimRoot); #ifdef VERSION snprintf (szIDManufacturerModel, sizeof(szIDManufacturerModel), "VERSION %s", VERSION); #endif @@ -374,13 +384,13 @@ DicomExporter::createDicomObject() {DCM_IDMODALITY, DCM_CS, "", 1, strlen(szModality), szModality}, {DCM_IDSOPCLASSUID, DCM_UI, "", 1, strlen(szSOPClassUID), szSOPClassUID}, {DCM_IDMANUFACTURERMODEL, DCM_LO, "", 1, strlen(szIDManufacturerModel), szIDManufacturerModel}, + {DCM_PATCOMMENTS, DCM_LT, "", 1, strlen(pszPatComments), pszPatComments}, }; int nElemRequired = sizeof (aElemRequired) / sizeof(DCM_ELEMENT); int iUpdateCount; cond = DCM_ModifyElements (&m_pObject, aElemRequired, nElemRequired, NULL, 0, &iUpdateCount); - DCM_ELEMENT elemPixelData = {DCM_PXLPIXELDATA, DCM_OT, "", 1, 0, NULL}; unsigned long lRealLength = 2 * m_pImageFile->nx() * m_pImageFile->ny(); @@ -390,10 +400,10 @@ DicomExporter::createDicomObject() elemPixelData.d.ot = pRawPixels; ImageFileArray v = m_pImageFile->getArray(); - for (int iy = iNRows - 1; iy >= 0; iy--) { + for (int iy = 0; iy < iNRows; iy++) { for (int ix = 0; ix < iNCols; ix++) { unsigned long lBase = (iy * iNRows + ix) * 2; - unsigned int iValue = nearest(dScale * (v[ix][iy] - dMin)); + unsigned int iValue = nearest(dScale * (v[ix][iNRows - 1 - iy] - dMin)); pRawPixels[lBase] = iValue & 0xFF; pRawPixels[lBase+1] = (iValue & 0xFF00) >> 8; } @@ -401,6 +411,8 @@ DicomExporter::createDicomObject() cond = DCM_ModifyElements (&m_pObject, &elemPixelData, 1, NULL, 0, &iUpdateCount); delete pRawPixels; + delete pszPatComments; + if (cond != DCM_NORMAL || iUpdateCount != 1) { m_bFail = true; m_strFailMessage = "Error modifying pixel data";