SVG5/SDCMImage.cpp
2025-10-12 13:55:56 +09:00

1955 lines
62 KiB
C++

#include "SDCMImage.h"
// #include "dcmtk/dcmdata/libi2d/i2d.h"
// #include "dcmtk/dcmdata/libi2d/i2dbmps.h"
// #include "dcmtk/dcmdata/libi2d/i2djpgs.h"
// #include "dcmtk/dcmdata/libi2d/i2dplsc.h"
// #include "dcmtk/dcmdata/libi2d/i2dplnsc.h"
// #include "dcmtk/dcmdata/libi2d/i2dplvlp.h"
#include "charconvert.h"
#ifdef UNICODE
#undef UNICODE
#undef _UNICODE
#define UNICODE_DEFINED
#endif
#include "dcmtk/config/osconfig.h"
#include "dcmtk/dcmdata/dcfilefo.h"
#include "dcmtk/dcmdata/dcdeftag.h"
#include "dcmtk/dcmdata/dcuid.h"
#include "dcmtk/dcmdata/dcmetinf.h"
#include "dcmtk/dcmdata/dcdict.h"
#include "dcmtk/dcmdata/dcdicent.h"
#include "dcmtk/dcmnet/diutil.h"
#include "dcmtk/dcmdata/dcxfer.h"
#include "dcmtk/dcmjpeg/djdecode.h" /* for JPEG decoders */
#include "dcmtk/dcmjpeg/djencode.h" /* for JPEG encoders */
#include "dcmtk/dcmjpls/djdecode.h" /* for JPEG-LS decoders */
#include "dcmtk/dcmjpls/djencode.h" /* for JPEG-LS encoders */
#include "dcmtk/dcmdata/dcrledrg.h" /* for RLE decoder */
#include "dcmtk/dcmdata/dcrleerg.h" /* for RLE encoder */
#include "dcmtk/dcmjpeg/dipijpeg.h" /* for dcmimage JPEG plugin */
#include "dcmtk/dcmjpeg/djrplol.h"
#include "dcmtk/dcmimage/diregist.h"
#include "dcmtk/dcmdata/dcpixseq.h"
#include "dcmtk/dcmjpeg/djcparam.h"
#include "dcmtk/dcmjpeg/djeijg8.h"
#include "dcmtk/dcmjpeg/djcodece.h"
#include "dcmtk/dcmdata/dcchrstr.h"
#include "dcmtk/ofstd/ofchrenc.h"
#include "dcmtk/dcmdata/dcvrui.h"
#include "dcmtk/dcmdata/dcvrsh.h"
#include "dcmtk/dcmdata/dcostrmf.h"
#include "dcmtk/dcmdata/dcwcache.h"
#include "mainwindow.h"
//#include "SDCMWorklistDlg.h"
/*
#include "dcmtk/dcmimgle/dcmimage.h"
#include "dcmtk/dcmdata/dcpxitem.h"
//#include "dcmtk/dcmjpeg/djencsv1.h"
*/
#ifdef UNICODE_DEFINED
#define UNICODE
#define _UNICODE
#undef UNICODE_DEFINED
#endif
#define PRIVATE_CREATOR_NAME "VideoNetworkFileLink"
#define PRIVATE_CREATOR_TAG 0x0029, 0x0010
#define PRIVATE_VIDEO_FILE_LINK 0x0029, 0x1000
#define PRIVATE_ELEMENT2_TAG 0x0029, 0x1010
#define PRIVATE_ELEMENT3_TAG 0x0029, 0x1020
#define PRV_PrivateCreator DcmTag(PRIVATE_CREATOR_TAG)
#define PRV_VIDEO_FILE_LINK DcmTag(PRIVATE_VIDEO_FILE_LINK, PRIVATE_CREATOR_NAME)
#define PRV_PrivateElement2 DcmTag(PRIVATE_ELEMENT2_TAG, PRIVATE_CREATOR_NAME)
#define PRV_PrivateElement3 DcmTag(PRIVATE_ELEMENT3_TAG, PRIVATE_CREATOR_NAME)
CSDCMImage::CSDCMImage(void)
{
//register global JPEG decompression codecs
DJDecoderRegistration::registerCodecs();
// register global JPEG compression codecs
DJEncoderRegistration::registerCodecs();
// register JPEG-LS decompression codecs
DJLSDecoderRegistration::registerCodecs();
// register JPEG-LS compression codecs
DJLSEncoderRegistration::registerCodecs();
// register RLE compression codec
DcmRLEEncoderRegistration::registerCodecs();
// register RLE decompression codec
DcmRLEDecoderRegistration::registerCodecs();
m_nInputFileFormat = 1;
m_nOutputFileFormat = 1;
m_pData = NULL;
//m_TransferSyntaxOutput = EXS_JPEG2000;//EXS_LittleEndianExplicit; // EXS_JPEGProcess14SV1, EXS_JPEG2000
//m_TransferSyntaxOutput = EXS_JPEGProcess14SV1;//EXS_LittleEndianExplicit; // EXS_JPEGProcess14SV1, EXS_JPEG2000
m_TransferSyntaxOutput = EXS_LittleEndianExplicit;
m_strImplementationClassUID = "1.2.3.4.5.6.7.8.9.10";
m_strImplementationVersionName = "SSD_Gateway_1_0";
}
CSDCMImage::~CSDCMImage(void)
{
SAFE_ARRAY_DELETE(m_pData);
//cleanup global JPEG decompression codecs
DJDecoderRegistration::cleanup();
// cleanup global JPEG compression codecs
DJEncoderRegistration::cleanup();
// cleanup JPEG-LS decompression codecs
DJLSDecoderRegistration::cleanup();
// cleanup JPEG-LS compression codecs
DJLSEncoderRegistration::cleanup();
// cleanup RLE compression codec
DcmRLEEncoderRegistration::cleanup();
// cleanup RLE decompression codec
DcmRLEDecoderRegistration::cleanup();
}
void CSDCMImage::LoadImage(OFString strFilename, BOOL bGray)
{
QImage image((QString)strFilename.c_str());
int nWidth = 0;
int nHeight = 0;
image = image.convertToFormat(QImage::Format_RGB888);
nWidth = image.width();
nHeight = image.height();
SAFE_ARRAY_DELETE(m_pData);
if (bGray == TRUE)
{
m_pData = new uint8_t[nWidth*nHeight];
}
else
{
m_pData = new uint8_t[nWidth*nHeight * 3];
}
m_nWidth = nWidth;
m_nHeight = nHeight;
uint8_t* pData = (uint8_t*)image.bits();
memcpy(m_pData, pData, image.byteCount());
}
void CSDCMImage::LoadImage(QString strFilename, BOOL bGray)
{
QImage image((QString)strFilename);
int nWidth = 0;
int nHeight = 0;
image = image.convertToFormat(QImage::Format_RGB888);
nWidth = image.width();
nHeight = image.height();
SAFE_ARRAY_DELETE(m_pData);
if (bGray == TRUE)
{
m_pData = new uint8_t[nWidth*nHeight];
}
else
{
m_pData = new uint8_t[nWidth*nHeight * 3];
}
m_nWidth = nWidth;
m_nHeight = nHeight;
uint8_t* pData = (uint8_t*)image.bits();
memcpy(m_pData, pData, image.byteCount());
}
int CSDCMImage::WriteDCM(OFString strInputImageFile, OFString strDcmFilename, WorklistResponseData* pWorklistData, int nSeriesNumber, int nImageNumber, BOOL bChangeUID, OFString strNewStudyInstanceUID, BOOL bUsePDFCompress)
{
return WriteDCM(strInputImageFile, strDcmFilename, pWorklistData, nSeriesNumber, nImageNumber, bChangeUID, strNewStudyInstanceUID);
}
int CSDCMImage::WriteDCM(OFString strInputImageFile, OFString strDcmFilename, OFString strContentDate, OFString strContentTime, WorklistResponseData* pWorklistData, int nSeriesNumber, int nImageNumber, BOOL bChangeUID, OFString strNewStudyInstanceUID)
{
int nRet = 0;
DcmFileFormat cDcmFileFormat;
E_TransferSyntax opt_ixfer = EXS_Unknown;
E_TransferSyntax opt_oxfer = EXS_LittleEndianExplicit;
const Uint32 DCM_MaxReadLength = 4096;
E_FileReadMode opt_readMode = ERM_autoDetect;
OFString ofFilename;
DcmStack cDcmStack;
DcmVR vr;
OFCondition error;
DcmDataset* pDcmDataset = NULL;
DcmElement* pElement = NULL;
OFString ofData;
OFString strModality = pWorklistData->m_Series.strModality.toStdString().c_str();
if(strInputImageFile.length()>0)
{
BOOL bGray = FALSE;
if(strModality=="CR")
{
bGray = TRUE;
}
bGray = FALSE;
m_nWidth = 0;
m_nHeight = 0;
LoadImage(strInputImageFile, bGray);
if(m_nWidth==0 || m_nHeight==0)
{
//WRITE_FUNCTION_LOG_PARAM("Error Load Image\n");
return -1;
}
}
//DeleteFile(strDcmFilename);
ofFilename = (OFString)strDcmFilename;
error = cDcmFileFormat.loadFile(ofFilename, opt_ixfer, EGL_noChange, DCM_MaxReadLength, opt_readMode);
pDcmDataset = cDcmFileFormat.getDataset();
pDcmDataset->loadAllDataIntoMemory();
cDcmStack.clear();
pDcmDataset->search(DCM_ImageType, cDcmStack);
WriteDeviceInfo(pDcmDataset);
WriteImageType(pDcmDataset, pWorklistData->m_Image.strImageType);
WriteLaterality(pDcmDataset, pWorklistData->m_Series.strLaterality, pWorklistData->m_Image.strImageLaterality);
WriteDateTime(pDcmDataset, pWorklistData);
WritePatientInfo(pDcmDataset, pWorklistData);
WriteScheduledProcedureStep(pDcmDataset, pWorklistData);
WriteImageInfo(pDcmDataset, strContentDate, strContentTime, pWorklistData, nImageNumber);
OFString strPixelSpacing = "0.01296529\\0.02018628";
//PutAndInsertString(pDcmDataset, DCM_PixelSpacing, strPixelSpacing);//"0.01296529\\0.02018628");
//PutAndInsertString(pDcmDataset, DCM_PatientOrientation, "L""\0x5f""F");
if(strModality=="OP")
{
DcmItem* pSubItem = NULL;
if (pDcmDataset->findOrCreateSequenceItem(DCM_AcquisitionDeviceTypeCodeSequence, pSubItem, -2 /*append*/).good() == true)
{
pSubItem->putAndInsertString(DCM_CodeValue, "LSO");
pSubItem->putAndInsertString(DCM_CodingSchemeDesignator, "99CZM_ACQDEVTYPE");
pSubItem->putAndInsertString(DCM_CodingSchemeVersion, "20120703");
pSubItem->putAndInsertString(DCM_CodeMeaning, "Line Scanning Ophthalmoscope");
}
pSubItem = NULL;
if (pDcmDataset->findOrCreateSequenceItem(DCM_LensesCodeSequence, pSubItem, -2 /*append*/).good() == true)
{
pSubItem->putAndInsertString(DCM_CodeValue, "R-10219");
pSubItem->putAndInsertString(DCM_CodingSchemeDesignator, "SRT");
pSubItem->putAndInsertString(DCM_CodeMeaning, "Indirect ophthalmoscopy lens");
}
pSubItem = NULL;
if (pDcmDataset->findOrCreateSequenceItem(DCM_ChannelDescriptionCodeSequence, pSubItem, -2 /*append*/).good() == true)
{
pSubItem->putAndInsertString(DCM_CodeValue, "R-102BE");
pSubItem->putAndInsertString(DCM_CodingSchemeDesignator, "SRT");
pSubItem->putAndInsertString(DCM_CodeMeaning, "Infrared");
}
PutAndInsertString(pDcmDataset, DCM_BurnedInAnnotation, "NO");
}
if(strInputImageFile.length()>0)
{
DJ_RPLossless params; // codec parameters, we use the defaults
opt_oxfer = m_TransferSyntaxOutput;
pDcmDataset->chooseRepresentation(opt_oxfer, &params);
if (pDcmDataset->canWriteXfer(opt_oxfer) == OFTrue)
{
pDcmDataset->findAndGetElement(DCM_MediaStorageSOPClassUID, pElement);
if (pElement != NULL)
{
pElement->getOFStringArray(ofData);
}
DcmMetaInfo* pMetaInfo = cDcmFileFormat.getMetaInfo();
delete pMetaInfo->remove(DCM_MediaStorageSOPClassUID);
delete pMetaInfo->remove(DCM_MediaStorageSOPInstanceUID);
//delete pMetaInfo->remove(DCM_ImplementationClassUID);
//delete pMetaInfo->remove(DCM_ImplementationVersionName);
/*
DcmElement *elem=NULL;
DcmTag implementationClassUID(DCM_ImplementationClassUID);
DcmTag ImplementationVersionName(DCM_ImplementationVersionName);
elem = new DcmUniqueIdentifier(implementationClassUID);
pMetaInfo->insert(elem, OFTrue);
const char *uid = "1.2.276.0.7230010.3.0.1.1.1";
((DcmUniqueIdentifier*)elem)->putString(uid);
elem = new DcmShortString(ImplementationVersionName);
pMetaInfo->insert(elem, OFTrue);
const char *versionName = "test1.2.3.4";
((DcmShortString*)elem)->putString(versionName);
*/
//PutAndInsertString(pDcmDataset, DCM_ImplementationClassUID, "1.2.3.4");
//PutAndInsertString(pDcmDataset, DCM_ImplementationVersionName, "SDCM1.0");
if(m_TransferSyntaxOutput==EXS_JPEG2000)
{
PutAndInsertString(pDcmDataset, DCM_LossyImageCompressionMethod, "ISO_15444_1");
PutAndInsertString(pDcmDataset, DCM_PhotometricInterpretation, "RGB");
}
pMetaInfo->findAndGetElement(DCM_MediaStorageSOPClassUID, pElement);
pMetaInfo->findAndDeleteElement(DCM_MediaStorageSOPClassUID);
pMetaInfo->findAndGetElement(DCM_MediaStorageSOPClassUID, pElement);
WriteStudyInfo(pDcmDataset, pWorklistData, nSeriesNumber, nImageNumber, bChangeUID, strNewStudyInstanceUID);
CharacterSetConversion(pDcmDataset);
//error = cDcmFileFormat.saveFile(ofFilename, opt_oxfer);
{
/*
virtual OFCondition saveFile(const OFFilename &fileName,
const E_TransferSyntax writeXfer = EXS_Unknown,
const E_EncodingType encodingType = EET_UndefinedLength,
const E_GrpLenEncoding groupLength = EGL_recalcGL,
const E_PaddingEncoding padEncoding = EPD_noChange,
const Uint32 padLength = 0,
const Uint32 subPadLength = 0,
const E_FileWriteMode writeMode = EWM_createNewMeta);
*/
const E_TransferSyntax writeXfer = opt_oxfer;
const E_EncodingType encodingType = EET_UndefinedLength;
{
DcmWriteCache wcache;
/* open file for output */
FILE* pFile = fopen(ofFilename.c_str(), "wb");
DcmOutputFileStream* fileStream = new DcmOutputFileStream(pFile);
//DcmOutputFileStream fileStream(ofFilename);
/* check stream status */
error = fileStream->status();
if (error.good())
{
/* write data to file */
cDcmFileFormat.transferInit();
error = cDcmFileFormat.write(*fileStream, writeXfer, encodingType, &wcache);//, groupLength,
//padEncoding, padLength, subPadLength, 0 /*instanceLength*/, writeMode);
cDcmFileFormat.transferEnd();
fileStream->flush();
}
//fsync(pFile);
fflush(pFile);
//fclose(pFile);
if(fileStream!=NULL)
{
delete fileStream;
fileStream = NULL;
}
}
}
}
}
if(error.good()==OFFalse)
{
nRet = -1;
}
return nRet;
}
int CSDCMImage::WriteDCM(QString strInputImageFile, QString strDcmFilename, QString strContentDate, QString strContentTime, WorklistResponseData* pWorklistData, int nSeriesNumber, int nImageNumber, BOOL bChangeUID, QString strNewStudyInstanceUID)
{
int nRet = 0;
DcmFileFormat cDcmFileFormat;
E_TransferSyntax opt_ixfer = EXS_Unknown;
E_TransferSyntax opt_oxfer = EXS_LittleEndianExplicit;
const Uint32 DCM_MaxReadLength = 4096;
E_FileReadMode opt_readMode = ERM_autoDetect;
OFString ofFilename;
OFString ofData;
DcmStack cDcmStack;
DcmVR vr;
OFCondition error;
DcmDataset* pDcmDataset = NULL;
DcmElement* pElement = NULL;
QString strModality = pWorklistData->m_Series.strModality;
if(strInputImageFile.size()>0)
{
BOOL bGray = FALSE;
if(strModality=="CR")
{
bGray = TRUE;
}
bGray = FALSE;
m_nWidth = 0;
m_nHeight = 0;
LoadImage(strInputImageFile, bGray);
if(m_nWidth==0 || m_nHeight==0)
{
//WRITE_FUNCTION_LOG_PARAM("Error Load Image\n");
return -1;
}
}
//DeleteFile(strDcmFilename);
ofFilename = strDcmFilename.toStdString().c_str();
error = cDcmFileFormat.loadFile(ofFilename, opt_ixfer, EGL_noChange, DCM_MaxReadLength, opt_readMode);
pDcmDataset = cDcmFileFormat.getDataset();
pDcmDataset->loadAllDataIntoMemory();
cDcmStack.clear();
pDcmDataset->search(DCM_ImageType, cDcmStack);
WriteDeviceInfo(pDcmDataset);
WriteImageType(pDcmDataset, pWorklistData->m_Image.strImageType);
WriteLaterality(pDcmDataset, pWorklistData->m_Series.strLaterality, pWorklistData->m_Image.strImageLaterality);
WriteDateTime(pDcmDataset, pWorklistData);
WritePatientInfo(pDcmDataset, pWorklistData);
WriteScheduledProcedureStep(pDcmDataset, pWorklistData);
WriteImageInfo(pDcmDataset, strContentDate, strContentTime, pWorklistData, nImageNumber);
OFString strPixelSpacing = "0.01296529\\0.02018628";
//PutAndInsertString(pDcmDataset, DCM_PixelSpacing, strPixelSpacing);//"0.01296529\\0.02018628");
//PutAndInsertString(pDcmDataset, DCM_PatientOrientation, "L""\0x5f""F");
if(strModality=="OP")
{
DcmItem* pSubItem = NULL;
if (pDcmDataset->findOrCreateSequenceItem(DCM_AcquisitionDeviceTypeCodeSequence, pSubItem, -2 /*append*/).good() == true)
{
pSubItem->putAndInsertString(DCM_CodeValue, "LSO");
pSubItem->putAndInsertString(DCM_CodingSchemeDesignator, "99CZM_ACQDEVTYPE");
pSubItem->putAndInsertString(DCM_CodingSchemeVersion, "20120703");
pSubItem->putAndInsertString(DCM_CodeMeaning, "Line Scanning Ophthalmoscope");
}
pSubItem = NULL;
if (pDcmDataset->findOrCreateSequenceItem(DCM_LensesCodeSequence, pSubItem, -2 /*append*/).good() == true)
{
pSubItem->putAndInsertString(DCM_CodeValue, "R-10219");
pSubItem->putAndInsertString(DCM_CodingSchemeDesignator, "SRT");
pSubItem->putAndInsertString(DCM_CodeMeaning, "Indirect ophthalmoscopy lens");
}
pSubItem = NULL;
if (pDcmDataset->findOrCreateSequenceItem(DCM_ChannelDescriptionCodeSequence, pSubItem, -2 /*append*/).good() == true)
{
pSubItem->putAndInsertString(DCM_CodeValue, "R-102BE");
pSubItem->putAndInsertString(DCM_CodingSchemeDesignator, "SRT");
pSubItem->putAndInsertString(DCM_CodeMeaning, "Infrared");
}
PutAndInsertString(pDcmDataset, DCM_BurnedInAnnotation, "NO");
}
if(strInputImageFile.size()>0)
{
DJ_RPLossless params; // codec parameters, we use the defaults
opt_oxfer = m_TransferSyntaxOutput;
pDcmDataset->chooseRepresentation(opt_oxfer, &params);
if (pDcmDataset->canWriteXfer(opt_oxfer) == OFTrue)
{
pDcmDataset->findAndGetElement(DCM_MediaStorageSOPClassUID, pElement);
if (pElement != NULL)
{
pElement->getOFStringArray(ofData);
}
DcmMetaInfo* pMetaInfo = cDcmFileFormat.getMetaInfo();
delete pMetaInfo->remove(DCM_MediaStorageSOPClassUID);
delete pMetaInfo->remove(DCM_MediaStorageSOPInstanceUID);
//delete pMetaInfo->remove(DCM_ImplementationClassUID);
//delete pMetaInfo->remove(DCM_ImplementationVersionName);
/*
DcmElement *elem=NULL;
DcmTag implementationClassUID(DCM_ImplementationClassUID);
DcmTag ImplementationVersionName(DCM_ImplementationVersionName);
elem = new DcmUniqueIdentifier(implementationClassUID);
pMetaInfo->insert(elem, OFTrue);
const char *uid = "1.2.276.0.7230010.3.0.1.1.1";
((DcmUniqueIdentifier*)elem)->putString(uid);
elem = new DcmShortString(ImplementationVersionName);
pMetaInfo->insert(elem, OFTrue);
const char *versionName = "test1.2.3.4";
((DcmShortString*)elem)->putString(versionName);
*/
//PutAndInsertString(pDcmDataset, DCM_ImplementationClassUID, "1.2.3.4");
//PutAndInsertString(pDcmDataset, DCM_ImplementationVersionName, "SDCM1.0");
if(m_TransferSyntaxOutput==EXS_JPEG2000)
{
PutAndInsertString(pDcmDataset, DCM_LossyImageCompressionMethod, "ISO_15444_1");
PutAndInsertString(pDcmDataset, DCM_PhotometricInterpretation, "RGB");
}
pMetaInfo->findAndGetElement(DCM_MediaStorageSOPClassUID, pElement);
pMetaInfo->findAndDeleteElement(DCM_MediaStorageSOPClassUID);
pMetaInfo->findAndGetElement(DCM_MediaStorageSOPClassUID, pElement);
WriteStudyInfo(pDcmDataset, pWorklistData, nSeriesNumber, nImageNumber, bChangeUID, strNewStudyInstanceUID);
CharacterSetConversion(pDcmDataset);
//error = cDcmFileFormat.saveFile(ofFilename, opt_oxfer);
{
/*
virtual OFCondition saveFile(const OFFilename &fileName,
const E_TransferSyntax writeXfer = EXS_Unknown,
const E_EncodingType encodingType = EET_UndefinedLength,
const E_GrpLenEncoding groupLength = EGL_recalcGL,
const E_PaddingEncoding padEncoding = EPD_noChange,
const Uint32 padLength = 0,
const Uint32 subPadLength = 0,
const E_FileWriteMode writeMode = EWM_createNewMeta);
*/
const E_TransferSyntax writeXfer = opt_oxfer;
const E_EncodingType encodingType = EET_UndefinedLength;
{
DcmWriteCache wcache;
/* open file for output */
FILE* pFile = fopen(ofFilename.c_str(), "wb");
DcmOutputFileStream* fileStream = new DcmOutputFileStream(pFile);
//DcmOutputFileStream fileStream(ofFilename);
/* check stream status */
error = fileStream->status();
if (error.good())
{
/* write data to file */
cDcmFileFormat.transferInit();
error = cDcmFileFormat.write(*fileStream, writeXfer, encodingType, &wcache);//, groupLength,
//padEncoding, padLength, subPadLength, 0 /*instanceLength*/, writeMode);
cDcmFileFormat.transferEnd();
fileStream->flush();
}
//fsync(pFile);
fflush(pFile);
//fclose(pFile);
if(fileStream!=NULL)
{
delete fileStream;
fileStream = NULL;
}
}
}
}
}
if(error.good()==OFFalse)
{
nRet = -1;
}
return nRet;
}
int CSDCMImage::WriteDCM(OFString strInputImageFile, OFString strDcmFilename, WorklistResponseData* pWorklistData, int nSeriesNumber, int nImageNumber, BOOL bChangeUID, OFString strNewStudyInstanceUID)
{
OFString strCreationDate;
OFString strCreationTime;
strCreationDate = pWorklistData->m_Image.strContentDate.toStdString().c_str();
strCreationTime = pWorklistData->m_Image.strContentTime.toStdString().c_str();
return WriteDCM(strInputImageFile, strDcmFilename, strCreationDate, strCreationTime, pWorklistData, nSeriesNumber, nImageNumber, bChangeUID, strNewStudyInstanceUID);
}
int CSDCMImage::WriteDCM(QString strInputImageFile, QString strDcmFilename, WorklistResponseData* pWorklistData, int nSeriesNumber, int nImageNumber, BOOL bChangeUID, QString strNewStudyInstanceUID)
{
QString strCreationDate;
QString strCreationTime;
strCreationDate = pWorklistData->m_Image.strContentDate;
strCreationTime = pWorklistData->m_Image.strContentTime;
return WriteDCM(strInputImageFile, strDcmFilename, strCreationDate, strCreationTime, pWorklistData, nSeriesNumber, nImageNumber, bChangeUID, strNewStudyInstanceUID);
}
void CSDCMImage::RegisterPrivateTags()
{
DcmDataDictionary &dict = dcmDataDict.wrlock();
dict.addEntry(new DcmDictEntry(PRIVATE_VIDEO_FILE_LINK, EVR_LO, "PrivateText", 1, 1, "private", OFTrue, PRIVATE_CREATOR_NAME));
dict.addEntry(new DcmDictEntry(PRIVATE_ELEMENT2_TAG, EVR_US, "PrivateInteger", 1, 1, "private", OFTrue, PRIVATE_CREATOR_NAME));
dict.addEntry(new DcmDictEntry(PRIVATE_ELEMENT3_TAG, EVR_OB, "PrivateBlob", 1, 1, "private", OFTrue, PRIVATE_CREATOR_NAME));
//dcmDataDict.unlock();
dcmDataDict.wrunlock();
}
void CSDCMImage::AddPrivateElements(DcmItem &item, OFString strFileLocation)
{
RegisterPrivateTags();
if (!item.tagExists(PRV_PrivateCreator))
{
item.putAndInsertString(PRV_PrivateCreator, PRIVATE_CREATOR_NAME);
item.putAndInsertOFStringArray(PRV_VIDEO_FILE_LINK, strFileLocation);
//item.putAndInsertUint16(PRV_PrivateElement2, 12345);
//item.putAndInsertUint8Array(PRV_PrivateElement3, NULL /*data*/, 0 /*length*/);
}
}
int CSDCMImage::LoadDCMFile(OFString strFilename)
{
int nRet = 0;
DcmFileFormat cDcmFileFormat;
OFCondition error;
OFString ofFilename = (OFString)strFilename;
E_TransferSyntax opt_ixfer = EXS_Unknown;
E_FileReadMode opt_readMode = ERM_autoDetect;
DcmDataset* pDcmDataset = NULL;
// DcmElement* pElement = NULL;
//RegisterPrivateTags();
error = cDcmFileFormat.loadFile(ofFilename, opt_ixfer, EGL_noChange, DCM_MaxReadLength, opt_readMode);
pDcmDataset = cDcmFileFormat.getDataset();
pDcmDataset->loadAllDataIntoMemory();
OFString strTransferSyntax;
pDcmDataset->findAndGetOFString(DCM_TransferSyntaxUID, strTransferSyntax);
OFString val;
// int nSamplePerPixel = 1;
pDcmDataset->findAndGetOFString(PRV_PrivateCreator, val);
pDcmDataset->findAndGetOFString(PRV_VIDEO_FILE_LINK, val);
Uint16 nRows = 0;
Uint16 nColumns = 0;
pDcmDataset->findAndGetUint16(DCM_Rows, nRows);
pDcmDataset->findAndGetUint16(DCM_Columns, nColumns);
if(nRows==0 || nColumns==0)
{
return -1;
}
unsigned long nImagePixelCount = 0;
//Uint8* pTestPixelData = new Uint8[nRows*nColumns*4];
const Uint8* pTestPixelData = NULL;
pDcmDataset->findAndGetUint8Array(DCM_PixelData, pTestPixelData, &nImagePixelCount);
if(pTestPixelData==NULL)
{
return -2;
}
if(nImagePixelCount==0)
{
return -3;
}
return nRet;
}
SDCM_AGE CSDCMImage::ComputeAge(QString strBirthdate)
{
SDCM_AGE nAge;
if(strBirthdate.length()==0)
{
return nAge;
}
/*
int nYears = 0;
int nMonths = 0;
int nDays = 0;
COleDateTime dt = COleDateTime::GetCurrentTime();
int nBirthYear = atoi(strBirthdate.Mid(0, 4));
int nBirthMonth = atoi(strBirthdate.Mid(4, 2));
int nBirthDay = atoi(strBirthdate.Mid(6, 2));
int nCurrentYear = dt.GetYear();
int nCurrentMonth = dt.GetMonth();
int nCurrentDay = dt.GetDay();
COleDateTime dtBirthDate(nBirthYear, nBirthMonth, nBirthDay, 0, 0, 0);
COleDateTimeSpan dtSpan = dt - dtBirthDate;
nDays = dtSpan.GetDays();
if(nDays<0)
{
return nAge;
}
nYears = nCurrentYear - nBirthYear;
nMonths = nCurrentMonth - nBirthMonth;
nMonths = (nYears*12)+nMonths;
nYears = nMonths%12;
nAge.m_nYears = nYears;
nAge.m_nMonths = nMonths;
nAge.m_nDays = nDays;
*/
/*
nYears = nCurrentYear - nBirthYear;
if(nYears>0)
{
BOOL bDecrement = FALSE;
if(nBirthMonth>nCurrentMonth)
{
bDecrement = TRUE;
}
else if(nBirthMonth==nCurrentMonth)
{
if(nBirthDay>=nCurrentDay)
{
bDecrement = TRUE;
}
}
if(bDecrement==TRUE)
{
nYears--;
}
}
if(nYears<0)
{
nYears = 0;
}
nAge.m_nYears = nYears;
*/
return nAge;
}
OFCondition CSDCMImage::PutAndInsertString(DcmDataset* pDcmDataset, const DcmTag &tag, const char *value)
{
OFCondition cond;
if(strlen(value)>0)
{
cond = pDcmDataset->putAndInsertString(tag, value);
}
return cond;
}
OFCondition CSDCMImage::PutAndInsertString(DcmDataset* pDcmDataset, const DcmTag &tag, QString strValue)
{
OFCondition cond;
if(strValue.size()>0)
{
cond = pDcmDataset->putAndInsertString(tag, strValue.toStdString().c_str());
}
return cond;
}
OFCondition CSDCMImage::PutAndInsertString(DcmDataset* pDcmDataset, const DcmTag &tag, OFString strValue)
{
OFCondition cond;
cond = PutAndInsertString(pDcmDataset, tag, strValue.c_str());
return cond;
}
void CSDCMImage::InsertCreationDate(DcmDataset* pDcmDataset)
{
QString strDate;
strDate = GetCurrentDate();
PutAndInsertString(pDcmDataset, DCM_InstanceCreationDate, strDate);
}
void CSDCMImage::InsertCreationTime(DcmDataset* pDcmDataset)
{
QString strTime;
strTime = GetCurrentTime();
PutAndInsertString(pDcmDataset, DCM_InstanceCreationTime, strTime);
}
QString CSDCMImage::GetCurrentDate()
{
QDate nDate = QDate::currentDate();
QString strCreationDateString = QString("%1%2%3").arg(nDate.year(), 4, 10, QChar('0')).arg(nDate.month(), 2, 10, QChar('0')).arg(nDate.day(), 2, 10, QChar('0'));
return strCreationDateString;
}
QString CSDCMImage::GetCurrentTime()
{
QTime nTime = QTime::currentTime();
QString strCreationTimeString = QString("%1%2%3").arg(nTime.hour(), 2, 10, QChar('0')).arg(nTime.minute(), 2, 10, QChar('0')).arg(nTime.second(), 2, 10, QChar('0'));
return strCreationTimeString;
}
void CSDCMImage::WritePatientInfo(DcmDataset* pDcmDataset, WorklistResponseData* pWorklistData)
{
QString strPatientName;
strPatientName = pWorklistData->m_Patient.strPatientName;
PutAndInsertString(pDcmDataset, DCM_PatientName, strPatientName);
PutAndInsertString(pDcmDataset, DCM_PatientID, pWorklistData->m_Patient.strPatientID);
PutAndInsertString(pDcmDataset, DCM_PatientSex, pWorklistData->m_Patient.strPatientSex);
if(pWorklistData->m_Patient.strPatientBirthDate.isEmpty()==false)
{
PutAndInsertString(pDcmDataset, DCM_PatientBirthDate, pWorklistData->m_Patient.strPatientBirthDate);
SDCM_AGE nAge;
nAge = ComputeAge(pWorklistData->m_Patient.strPatientBirthDate);
if(nAge.m_nYears>0)
{
QString strAge;
strAge = QString("%1Y").arg(QString::number(nAge.m_nYears));
PutAndInsertString(pDcmDataset, DCM_PatientAge, (OFString)strAge.toStdString().c_str());
}
}
PutAndInsertString(pDcmDataset, DCM_PatientWeight, pWorklistData->m_Patient.strPatientWeight);
PutAndInsertString(pDcmDataset, DCM_PatientComments, pWorklistData->m_Patient.strPatientComments);
//BodyPartExamined
PutAndInsertString(pDcmDataset, DCM_BodyPartExamined, pWorklistData->m_Series.strBodyPartExamined);
//PatientOrientation
PutAndInsertString(pDcmDataset, DCM_PatientOrientation, pWorklistData->strPatientOrientation);
//Patient Location
PutAndInsertString(pDcmDataset, DCM_CurrentPatientLocation, pWorklistData->m_Patient.strPatientLocation);
}
void CSDCMImage::WriteScheduledProcedureStep(DcmDataset* pDcmDataset, WorklistResponseData* pWorklistData)
{
}
OFString CSDCMImage::CreateStudyInstanceUID()
{
OFString strStudyInstanceUID;
OFString strTmp;
int i=0;
/*
COleDateTime dt = COleDateTime::GetCurrentTime();
strTmp.Format(".%04d%02d%02d.%02d%02d%02d.", dt.GetYear(), dt.GetMonth(), dt.GetDay(), dt.GetHour(),dt.GetMinute(), dt.GetSecond());
strStudyInstanceUID = CSDCM::m_strManufacturerUID;
strStudyInstanceUID += strTmp;
strTmp = CSDCM::m_strInstitutionName;
for(i=0 ; i<CSDCM::m_strStationName.GetLength() ; i++)
{
char c = CSDCM::m_strStationName.GetAt(i);
strTmp.Format("%d", c);
strStudyInstanceUID += strTmp;
}
strTmp += ".";
strTmp = CSDCM::m_strStationName;
for(i=0 ; i<CSDCM::m_strStationName.GetLength() ; i++)
{
char c = CSDCM::m_strStationName.GetAt(i);
strTmp.Format("%d", c);
strStudyInstanceUID += strTmp;
}
*/
return strStudyInstanceUID;
}
void CSDCMImage::WriteStudyInfo(DcmDataset* pDcmDataset, WorklistResponseData* pWorklistData, int nSeriesNumber, int nImageNumber, BOOL bChangeUID, OFString strNewStudyInstanceUID)
{
CommonData* pCommonData = MainWindow::GetCommonData();
OFString strSOPClassUID;
OFString strMediaStorageSOPClassUID;
OFString strModality;
OFString strStudyInstanceUID;
OFString strSeriesInstanceUID;
OFString strImageInstanceUID;
OFString strStudyDescription;
OFString strSeriesDescription;
OFString strAccessionNumber;
OFString strSeriesNumber;
OFString strImageNumber;
OFString strReferringPhysicianName;
OFString strPerformedProcedureStepStartDate;
OFString strPerformedProcedureStepStartTime;
OFString strPerformedProcedureStepDescription;
OFString strOperatorsName;
OFString strStudyID;
strStudyID = pWorklistData->m_ScheduledData.strScheduledCodeValue.toStdString().c_str();
strPerformedProcedureStepStartDate = pWorklistData->m_ScheduledData.strScheduledProcedureStepStartDate.toStdString().c_str();
strPerformedProcedureStepStartTime = pWorklistData->m_ScheduledData.strScheduledProcedureStepStartTime.toStdString().c_str();
strPerformedProcedureStepDescription = pWorklistData->m_ScheduledData.strScheduledStepDescription.toStdString().c_str();
strOperatorsName = pWorklistData->m_Series.strOperatorsName.toStdString().c_str();
strModality = pWorklistData->m_Series.strModality.toStdString().c_str();
if(strModality.size()==0)
{
CommonData* pCommonData = MainWindow::GetCommonData();
QString strDefualtModality = pCommonData->GetModality();
strModality = strDefualtModality.toStdString().c_str();
}
//strSeriesNumber.Format("%d", nSeriesNumber);
//strImageNumber.Format("%d", nImageNumber);
strSeriesNumber = QString::number(nSeriesNumber).toStdString().c_str();
strImageNumber = QString::number(nImageNumber).toStdString().c_str();
if(nImageNumber==0)
{
}
if(pWorklistData->m_Study.strStudyInstanceUID.size()==0)
{
}
strSeriesInstanceUID = pWorklistData->m_Series.strSeriesInstanceUID.toStdString().c_str();
strImageInstanceUID = pWorklistData->m_Image.strInstanceUID.toStdString().c_str();
if(pWorklistData->m_Study.strStudyInstanceUID.size()>0)
{
strStudyInstanceUID = pWorklistData->m_Study.strStudyInstanceUID.toStdString().c_str();
}
else
{
strStudyInstanceUID = "1.2.276.0.75.2.2.42.896740696295.1.2.3";
}
//if(strSeriesInstanceUID.length()==0)
{
strSeriesInstanceUID = strStudyInstanceUID + "." + strSeriesNumber;
}
if(strImageInstanceUID.length()==0)
{
strImageInstanceUID = strSeriesInstanceUID + "." + strImageNumber;
}
if(bChangeUID==TRUE)
{
//strStudyInstanceUID = CreateStudyInstanceUID();
if(strNewStudyInstanceUID.length()>0)
{
strStudyInstanceUID = strNewStudyInstanceUID;
}
}
//strStudyInstanceUID = "1.2.276.0.75.2.5.30.25.20170601.2343000.123.4";
//strSeriesInstanceUID = strStudyInstanceUID + "." + strSeriesNumber;
//strImageInstanceUID = strSeriesInstanceUID + "." + strImageNumber;
strAccessionNumber = pWorklistData->m_Study.strAccessionNumber.toStdString().c_str();
if (strAccessionNumber.length() == 0)
{
strAccessionNumber = "1";
}
strReferringPhysicianName = pWorklistData->strReferringPhysicianName.toStdString().c_str();
if (strModality == "SC")
{
strSOPClassUID = UID_SecondaryCaptureImageStorage;
//strMediaStorageSOPClassUID = UID_SecondaryCaptureImageStorage;
strStudyDescription = "SC Study Description";
strSeriesDescription = "SC Series Description";
}
else if (strModality == "OT")
{
strSOPClassUID = UID_SecondaryCaptureImageStorage;
//strMediaStorageSOPClassUID = UID_SecondaryCaptureImageStorage;
strStudyDescription = "OT Study Description";
strSeriesDescription = "OT Series Description";
}
else if (strModality == "ES")
{
strSOPClassUID = UID_VLEndoscopicImageStorage;
strMediaStorageSOPClassUID = UID_VLEndoscopicImageStorage;
strStudyDescription = "ES Study Description";
strSeriesDescription = "ES Series Description";
}
else if (strModality == "CR")
{
strSOPClassUID = UID_ComputedRadiographyImageStorage;
strMediaStorageSOPClassUID = UID_ComputedRadiographyImageStorage;
strStudyDescription = "CR Study Description";
strSeriesDescription = "CR Series Description";
}
else if (strModality == "DR")
{
strSOPClassUID = UID_DigitalXRayImageStorageForPresentation;
strMediaStorageSOPClassUID = UID_DigitalXRayImageStorageForPresentation;
strStudyDescription = "DR Study Description";
strSeriesDescription = "DR Series Description";
}
else if (strModality == "BMD")
{
strSOPClassUID = UID_DigitalXRayImageStorageForPresentation;
strMediaStorageSOPClassUID = UID_DigitalXRayImageStorageForPresentation;
strStudyDescription = "BMD Study Description";
strSeriesDescription = "BMD Series Description";
}
else if (strModality == "OP")
{
strSOPClassUID = UID_OphthalmicPhotography8BitImageStorage;
//strMediaStorageSOPClassUID = UID_OphthalmicPhotography8BitImageStorage;
strStudyDescription = "OP Study Description";
strSeriesDescription = "OP Series Description";
}
else if (strModality == "OPT")
{
strSOPClassUID = UID_OphthalmicTomographyImageStorage;
//strMediaStorageSOPClassUID = UID_OphthalmicPhotography8BitImageStorage;
strStudyDescription = "OPT Study Description";
strSeriesDescription = "OPT Series Description";
}
else if (strModality == "OCT")
{
strSOPClassUID = UID_OphthalmicPhotography8BitImageStorage;
//strMediaStorageSOPClassUID = UID_OphthalmicPhotography8BitImageStorage;
strStudyDescription = "OCT Study Description";
strSeriesDescription = "OCT Series Description";
}
if (pWorklistData->m_Series.strSeriesDescription.size()>0)
{
strSeriesDescription = pWorklistData->m_Series.strSeriesDescription.toStdString().c_str();
}
if (pWorklistData->m_Study.strStudyDescription.size()>0)
{
strStudyDescription = pWorklistData->m_Study.strStudyDescription.toStdString().c_str();
strSeriesDescription = pWorklistData->m_Study.strStudyDescription.toStdString().c_str();
}
//Media Storage SOP UID
if (strMediaStorageSOPClassUID.length() > 0)
{
//PutAndInsertString(pDcmDataset, DCM_MediaStorageSOPClassUID, (OFString)strMediaStorageSOPClassUID);
}
//SOP Common Info
//UTF-8 : ISO_IR 192
//Ansi : ISO_IR 100
//PutAndInsertString(pDcmDataset, DCM_SpecificCharacterSet, "ISO_IR 100"); //(ISO IR 100), (ISO 2022 IR 149)
//OFString strEncDICOM = CSDCMStringEncoder::GetStringEncDICOM();
OFString strEncDICOM = "UTF-8";
strEncDICOM = pCommonData->GetDICOMCharacterSet().toStdString().c_str();
if (strEncDICOM == "ASCII")
{
PutAndInsertString(pDcmDataset, DCM_SpecificCharacterSet, "ISO_IR 100"); //ANSI
}
else if (strEncDICOM == "ISO-2022-KR")
{
PutAndInsertString(pDcmDataset, DCM_SpecificCharacterSet, "ISO 2022 IR 149"); //KOREAN
}
else if (strEncDICOM == "EUC-KR")
{
PutAndInsertString(pDcmDataset, DCM_SpecificCharacterSet, "ISO 2022 IR 149"); //KOREAN
}
else if (strEncDICOM == "UTF-8")
{
PutAndInsertString(pDcmDataset, DCM_SpecificCharacterSet, "ISO_IR 192"); //UTF-8
}
PutAndInsertString(pDcmDataset, DCM_SOPClassUID, strSOPClassUID);
//Scheduled Info
PutAndInsertString(pDcmDataset, DCM_PerformedProcedureStepStartDate, strPerformedProcedureStepStartDate);
if(strPerformedProcedureStepStartTime.length()>0)
{
//if(strPerformedProcedureStepStartTime.Find(".")<0)
if(strPerformedProcedureStepStartTime.find(".")<=0)
{
strPerformedProcedureStepStartTime += "";
}
PutAndInsertString(pDcmDataset, DCM_PerformedProcedureStepStartTime, strPerformedProcedureStepStartTime);
}
PutAndInsertString(pDcmDataset, DCM_PerformedProcedureStepDescription, strPerformedProcedureStepDescription);
//UID Info
PutAndInsertString(pDcmDataset, DCM_StudyInstanceUID, strStudyInstanceUID);
PutAndInsertString(pDcmDataset, DCM_SeriesInstanceUID, strSeriesInstanceUID);
PutAndInsertString(pDcmDataset, DCM_SOPInstanceUID, strImageInstanceUID);
//General Study
PutAndInsertString(pDcmDataset, DCM_ReferringPhysicianName, strReferringPhysicianName);
PutAndInsertString(pDcmDataset, DCM_AccessionNumber, strAccessionNumber);
PutAndInsertString(pDcmDataset, DCM_StudyDescription, strStudyDescription);
//General Series
PutAndInsertString(pDcmDataset, DCM_Modality, strModality);
PutAndInsertString(pDcmDataset, DCM_SeriesDescription, strSeriesDescription);
PutAndInsertString(pDcmDataset, DCM_SeriesNumber, strSeriesNumber);
PutAndInsertString(pDcmDataset, DCM_OperatorsName, strOperatorsName);
//Study ID
PutAndInsertString(pDcmDataset, DCM_StudyID, strStudyID);
}
void CSDCMImage::WriteStudyInfo(DcmDataset* pDcmDataset, WorklistResponseData* pWorklistData, int nSeriesNumber, int nImageNumber, BOOL bChangeUID, QString strNewStudyInstanceUID)
{
CommonData* pCommonData = MainWindow::GetCommonData();
QString strSOPClassUID;
QString strMediaStorageSOPClassUID;
QString strModality;
QString strStudyInstanceUID;
QString strSeriesInstanceUID;
QString strImageInstanceUID;
QString strStudyDescription;
QString strSeriesDescription;
QString strAccessionNumber;
QString strSeriesNumber;
QString strImageNumber;
QString strReferringPhysicianName;
QString strPerformedProcedureStepStartDate;
QString strPerformedProcedureStepStartTime;
QString strPerformedProcedureStepDescription;
QString strOperatorsName;
QString strStudyID;
strStudyID = pWorklistData->m_ScheduledData.strScheduledCodeValue;
strPerformedProcedureStepStartDate = pWorklistData->m_ScheduledData.strScheduledProcedureStepStartDate;
strPerformedProcedureStepStartTime = pWorklistData->m_ScheduledData.strScheduledProcedureStepStartTime;
strPerformedProcedureStepDescription = pWorklistData->m_ScheduledData.strScheduledStepDescription;
strOperatorsName = pWorklistData->m_Series.strOperatorsName;
strModality = pWorklistData->m_Series.strModality;
if(strModality.size()==0)
{
CommonData* pCommonData = MainWindow::GetCommonData();
QString strDefualtModality = pCommonData->GetModality();
strModality = strDefualtModality;
}
//strSeriesNumber.Format("%d", nSeriesNumber);
//strImageNumber.Format("%d", nImageNumber);
strSeriesNumber = QString::number(nSeriesNumber);
strImageNumber = QString::number(nImageNumber);
if(nImageNumber==0)
{
}
if(pWorklistData->m_Study.strStudyInstanceUID.size()==0)
{
}
strSeriesInstanceUID = pWorklistData->m_Series.strSeriesInstanceUID;
strImageInstanceUID = pWorklistData->m_Image.strInstanceUID;
if(pWorklistData->m_Study.strStudyInstanceUID.size()>0)
{
strStudyInstanceUID = pWorklistData->m_Study.strStudyInstanceUID;
}
else
{
strStudyInstanceUID = "1.2.276.0.75.2.2.42.896740696295.1.2.3";
}
//if(strSeriesInstanceUID.length()==0)
{
strSeriesInstanceUID = strStudyInstanceUID + "." + strSeriesNumber;
}
if(strImageInstanceUID.size()==0)
{
strImageInstanceUID = strSeriesInstanceUID + "." + strImageNumber;
}
if(bChangeUID==TRUE)
{
//strStudyInstanceUID = CreateStudyInstanceUID();
if(strNewStudyInstanceUID.length()>0)
{
strStudyInstanceUID = strNewStudyInstanceUID;
}
}
//strStudyInstanceUID = "1.2.276.0.75.2.5.30.25.20170601.2343000.123.4";
//strSeriesInstanceUID = strStudyInstanceUID + "." + strSeriesNumber;
//strImageInstanceUID = strSeriesInstanceUID + "." + strImageNumber;
strAccessionNumber = pWorklistData->m_Study.strAccessionNumber;
if (strAccessionNumber.length() == 0)
{
strAccessionNumber = "1";
}
strReferringPhysicianName = pWorklistData->strReferringPhysicianName;
if (strModality == "SC")
{
strSOPClassUID = UID_SecondaryCaptureImageStorage;
//strMediaStorageSOPClassUID = UID_SecondaryCaptureImageStorage;
strStudyDescription = "SC Study Description";
strSeriesDescription = "SC Series Description";
}
else if (strModality == "OT")
{
strSOPClassUID = UID_SecondaryCaptureImageStorage;
//strMediaStorageSOPClassUID = UID_SecondaryCaptureImageStorage;
strStudyDescription = "OT Study Description";
strSeriesDescription = "OT Series Description";
}
else if (strModality == "ES")
{
strSOPClassUID = UID_VLEndoscopicImageStorage;
strMediaStorageSOPClassUID = UID_VLEndoscopicImageStorage;
strStudyDescription = "ES Study Description";
strSeriesDescription = "ES Series Description";
}
else if (strModality == "CR")
{
strSOPClassUID = UID_ComputedRadiographyImageStorage;
strMediaStorageSOPClassUID = UID_ComputedRadiographyImageStorage;
strStudyDescription = "CR Study Description";
strSeriesDescription = "CR Series Description";
}
else if (strModality == "DR")
{
strSOPClassUID = UID_DigitalXRayImageStorageForPresentation;
strMediaStorageSOPClassUID = UID_DigitalXRayImageStorageForPresentation;
strStudyDescription = "DR Study Description";
strSeriesDescription = "DR Series Description";
}
else if (strModality == "BMD")
{
strSOPClassUID = UID_DigitalXRayImageStorageForPresentation;
strMediaStorageSOPClassUID = UID_DigitalXRayImageStorageForPresentation;
strStudyDescription = "BMD Study Description";
strSeriesDescription = "BMD Series Description";
}
else if (strModality == "OP")
{
strSOPClassUID = UID_OphthalmicPhotography8BitImageStorage;
//strMediaStorageSOPClassUID = UID_OphthalmicPhotography8BitImageStorage;
strStudyDescription = "OP Study Description";
strSeriesDescription = "OP Series Description";
}
else if (strModality == "OPT")
{
strSOPClassUID = UID_OphthalmicTomographyImageStorage;
//strMediaStorageSOPClassUID = UID_OphthalmicPhotography8BitImageStorage;
strStudyDescription = "OPT Study Description";
strSeriesDescription = "OPT Series Description";
}
else if (strModality == "OCT")
{
strSOPClassUID = UID_OphthalmicPhotography8BitImageStorage;
//strMediaStorageSOPClassUID = UID_OphthalmicPhotography8BitImageStorage;
strStudyDescription = "OCT Study Description";
strSeriesDescription = "OCT Series Description";
}
if (pWorklistData->m_Series.strSeriesDescription.size()>0)
{
strSeriesDescription = pWorklistData->m_Series.strSeriesDescription;
}
if (pWorklistData->m_Study.strStudyDescription.size()>0)
{
strStudyDescription = pWorklistData->m_Study.strStudyDescription;
strSeriesDescription = pWorklistData->m_Study.strStudyDescription;
}
//Media Storage SOP UID
if (strMediaStorageSOPClassUID.length() > 0)
{
//PutAndInsertString(pDcmDataset, DCM_MediaStorageSOPClassUID, (OFString)strMediaStorageSOPClassUID);
}
//SOP Common Info
//UTF-8 : ISO_IR 192
//Ansi : ISO_IR 100
//PutAndInsertString(pDcmDataset, DCM_SpecificCharacterSet, "ISO_IR 100"); //(ISO IR 100), (ISO 2022 IR 149)
//OFString strEncDICOM = CSDCMStringEncoder::GetStringEncDICOM();
QString strEncDICOM = "UTF-8";
strEncDICOM = pCommonData->GetDICOMCharacterSet();
if (strEncDICOM == "ASCII")
{
PutAndInsertString(pDcmDataset, DCM_SpecificCharacterSet, "ISO_IR 100"); //ANSI
}
else if (strEncDICOM == "ISO-2022-KR")
{
PutAndInsertString(pDcmDataset, DCM_SpecificCharacterSet, "ISO 2022 IR 149"); //KOREAN
}
else if (strEncDICOM == "EUC-KR")
{
PutAndInsertString(pDcmDataset, DCM_SpecificCharacterSet, "ISO 2022 IR 149"); //KOREAN
}
else if (strEncDICOM == "UTF-8")
{
PutAndInsertString(pDcmDataset, DCM_SpecificCharacterSet, "ISO_IR 192"); //UTF-8
}
PutAndInsertString(pDcmDataset, DCM_SOPClassUID, strSOPClassUID);
//Scheduled Info
PutAndInsertString(pDcmDataset, DCM_PerformedProcedureStepStartDate, strPerformedProcedureStepStartDate);
if(strPerformedProcedureStepStartTime.size()>0)
{
/*
if(strPerformedProcedureStepStartTime.find(".")<=0)
{
strPerformedProcedureStepStartTime += "";
}
*/
strPerformedProcedureStepStartTime.replace(".", "");
PutAndInsertString(pDcmDataset, DCM_PerformedProcedureStepStartTime, strPerformedProcedureStepStartTime);
}
PutAndInsertString(pDcmDataset, DCM_PerformedProcedureStepDescription, strPerformedProcedureStepDescription);
//UID Info
PutAndInsertString(pDcmDataset, DCM_StudyInstanceUID, strStudyInstanceUID);
PutAndInsertString(pDcmDataset, DCM_SeriesInstanceUID, strSeriesInstanceUID);
PutAndInsertString(pDcmDataset, DCM_SOPInstanceUID, strImageInstanceUID);
//General Study
PutAndInsertString(pDcmDataset, DCM_ReferringPhysicianName, strReferringPhysicianName);
PutAndInsertString(pDcmDataset, DCM_AccessionNumber, strAccessionNumber);
PutAndInsertString(pDcmDataset, DCM_StudyDescription, strStudyDescription);
//General Series
PutAndInsertString(pDcmDataset, DCM_Modality, strModality);
PutAndInsertString(pDcmDataset, DCM_SeriesDescription, strSeriesDescription);
PutAndInsertString(pDcmDataset, DCM_SeriesNumber, strSeriesNumber);
PutAndInsertString(pDcmDataset, DCM_OperatorsName, strOperatorsName);
//Study ID
PutAndInsertString(pDcmDataset, DCM_StudyID, strStudyID);
}
void CSDCMImage::WriteImageInfo(DcmDataset* pDcmDataset, OFString strContentDate, OFString strContentTime, WorklistResponseData* pWorklistData, int nImageNumber)
{
CommonData* pCommonData = MainWindow::GetCommonData();
bool bIsUseFixWidthLevel = (bool)pCommonData->GetUseFixWidthLevel();
OFString strImageNumber;
OFString strAcquisitionDateTime;
OFString strModality;
strAcquisitionDateTime = strContentDate.c_str();
strAcquisitionDateTime += strContentTime.c_str();
//strImageNumber.Format("%d", nImageNumber);
strImageNumber = QString::number(nImageNumber).toStdString().c_str();
PutAndInsertString(pDcmDataset, DCM_InstanceNumber, strImageNumber);
//PutAndInsertString(pDcmDataset, DCM_ImageComments, "Comment NULL");
PutAndInsertString(pDcmDataset, DCM_AcquisitionDateTime, strAcquisitionDateTime);
if(bIsUseFixWidthLevel==true)
{
//PutAndInsertString(pDcmDataset, DCM_WindowCenter, "156.0");
//PutAndInsertString(pDcmDataset, DCM_WindowWidth, "268.0");
PutAndInsertString(pDcmDataset, DCM_WindowCenter, "128.0");
PutAndInsertString(pDcmDataset, DCM_WindowWidth, "185.0");
}
else
{
PutAndInsertString(pDcmDataset, DCM_WindowCenter, "128.0");
PutAndInsertString(pDcmDataset, DCM_WindowWidth, "256.0");
}
pDcmDataset->putAndInsertUint16(DCM_BitsAllocated, 8);
pDcmDataset->putAndInsertUint16(DCM_BitsStored, 8);
pDcmDataset->putAndInsertUint16(DCM_HighBit, 7);
pDcmDataset->putAndInsertUint16(DCM_PixelRepresentation, 0);
DcmStack cDcmStack;
cDcmStack.clear();
OFCondition error = pDcmDataset->search(DCM_PixelData, cDcmStack);
strModality = pWorklistData->m_Series.strModality.toStdString().c_str();
BOOL bGray = FALSE;
if(strModality == "CR")
{
bGray = TRUE;
}
bGray = FALSE;
if (bGray == TRUE)
{
pDcmDataset->putAndInsertUint16(DCM_SamplesPerPixel, 1);
PutAndInsertString(pDcmDataset, DCM_PhotometricInterpretation, "MONOCHROME2");
pDcmDataset->putAndInsertUint16(DCM_Rows, m_nHeight);
pDcmDataset->putAndInsertUint16(DCM_Columns, m_nWidth);
pDcmDataset->putAndInsertUint8Array(DCM_PixelData, (Uint8*)m_pData, m_nWidth*m_nHeight, TRUE);
}
else
{
pDcmDataset->putAndInsertUint16(DCM_PlanarConfiguration, 0);
PutAndInsertString(pDcmDataset, DCM_NumberOfFrames, "1");
pDcmDataset->putAndInsertUint16(DCM_SamplesPerPixel, 3);
PutAndInsertString(pDcmDataset, DCM_PhotometricInterpretation, "RGB");
PutAndInsertString(pDcmDataset, DCM_ConversionType, "DV");
pDcmDataset->putAndInsertUint16(DCM_Rows, m_nHeight);
pDcmDataset->putAndInsertUint16(DCM_Columns, m_nWidth);
pDcmDataset->putAndInsertUint8Array(DCM_PixelData, (Uint8*)m_pData, m_nWidth*m_nHeight*3, TRUE);
}
}
void CSDCMImage::WriteImageInfo(DcmDataset* pDcmDataset, QString strContentDate, QString strContentTime, WorklistResponseData* pWorklistData, int nImageNumber)
{
CommonData* pCommonData = MainWindow::GetCommonData();
bool bIsUseFixWidthLevel = (bool)pCommonData->GetUseFixWidthLevel();
QString strImageNumber;
QString strAcquisitionDateTime;
QString strModality;
strAcquisitionDateTime = strContentDate;
strAcquisitionDateTime += strContentTime;
//strImageNumber.Format("%d", nImageNumber);
strImageNumber = QString::number(nImageNumber);
PutAndInsertString(pDcmDataset, DCM_InstanceNumber, strImageNumber);
//PutAndInsertString(pDcmDataset, DCM_ImageComments, "Comment NULL");
PutAndInsertString(pDcmDataset, DCM_AcquisitionDateTime, strAcquisitionDateTime);
if(bIsUseFixWidthLevel==true)
{
//PutAndInsertString(pDcmDataset, DCM_WindowCenter, "156.0");
//PutAndInsertString(pDcmDataset, DCM_WindowWidth, "268.0");
PutAndInsertString(pDcmDataset, DCM_WindowCenter, "128.0");
PutAndInsertString(pDcmDataset, DCM_WindowWidth, "185.0");
}
else
{
PutAndInsertString(pDcmDataset, DCM_WindowCenter, "128.0");
PutAndInsertString(pDcmDataset, DCM_WindowWidth, "256.0");
}
pDcmDataset->putAndInsertUint16(DCM_BitsAllocated, 8);
pDcmDataset->putAndInsertUint16(DCM_BitsStored, 8);
pDcmDataset->putAndInsertUint16(DCM_HighBit, 7);
pDcmDataset->putAndInsertUint16(DCM_PixelRepresentation, 0);
DcmStack cDcmStack;
cDcmStack.clear();
OFCondition error = pDcmDataset->search(DCM_PixelData, cDcmStack);
strModality = pWorklistData->m_Series.strModality;
BOOL bGray = FALSE;
if(strModality == "CR")
{
bGray = TRUE;
}
bGray = FALSE;
if (bGray == TRUE)
{
pDcmDataset->putAndInsertUint16(DCM_SamplesPerPixel, 1);
PutAndInsertString(pDcmDataset, DCM_PhotometricInterpretation, "MONOCHROME2");
pDcmDataset->putAndInsertUint16(DCM_Rows, m_nHeight);
pDcmDataset->putAndInsertUint16(DCM_Columns, m_nWidth);
pDcmDataset->putAndInsertUint8Array(DCM_PixelData, (Uint8*)m_pData, m_nWidth*m_nHeight, TRUE);
}
else
{
pDcmDataset->putAndInsertUint16(DCM_PlanarConfiguration, 0);
PutAndInsertString(pDcmDataset, DCM_NumberOfFrames, "1");
pDcmDataset->putAndInsertUint16(DCM_SamplesPerPixel, 3);
PutAndInsertString(pDcmDataset, DCM_PhotometricInterpretation, "RGB");
PutAndInsertString(pDcmDataset, DCM_ConversionType, "DV");
pDcmDataset->putAndInsertUint16(DCM_Rows, m_nHeight);
pDcmDataset->putAndInsertUint16(DCM_Columns, m_nWidth);
pDcmDataset->putAndInsertUint8Array(DCM_PixelData, (Uint8*)m_pData, m_nWidth*m_nHeight*3, TRUE);
}
}
void CSDCMImage::WriteImageInfo(DcmDataset* pDcmDataset, WorklistResponseData* pWorklistData, int nImageNumber)
{
QString strCreationDate;
QString strCreationTime;
strCreationDate = GetCurrentDate();
strCreationTime = GetCurrentTime();
WriteImageInfo(pDcmDataset, strCreationDate, strCreationTime, pWorklistData, nImageNumber);
}
void CSDCMImage::WriteDateTime(DcmDataset* pDcmDataset, WorklistResponseData* pWorklistData)
{
QString strCreationDate;
QString strCreationTime;
QString strStudyDate;
QString strStudyTime;
QString strSeriesDate;
QString strSeriesTime;
if(pWorklistData->m_Image.strAcquisitionDate.length()>0)
{
strCreationDate = pWorklistData->m_Image.strAcquisitionDate;
strCreationTime = pWorklistData->m_Image.strAcquisitionTime;
}
//strStudyDate = pWorklistData->m_ScheduledData.strScheduledProcedureStepStartDate.c_str();
//strStudyTime = pWorklistData->m_ScheduledData.strScheduledProcedureStepStartTime.c_str();
strStudyDate = pWorklistData->m_Study.strStudyDate;
strStudyTime = pWorklistData->m_Study.strStudyTime;
strSeriesDate = pWorklistData->m_Series.strSeriesDate;
strSeriesTime = pWorklistData->m_Series.strSeriesTime;
if (strStudyTime.length()>0)
{
strStudyTime.replace(".", "");
}
if(strCreationDate.length()==0)
{
strCreationDate = GetCurrentDate();
strCreationTime = GetCurrentTime();
}
if (strStudyDate.length()==0)
{
strStudyDate = strCreationDate;
}
if (strStudyTime.length()==0)
{
strStudyTime = strCreationTime;
}
if (strSeriesDate.length()==0)
{
strSeriesDate = strStudyDate;
}
if (strSeriesTime.length()==0)
{
strSeriesTime = strStudyTime;
}
PutAndInsertString(pDcmDataset, DCM_StudyDate, strStudyDate);
PutAndInsertString(pDcmDataset, DCM_StudyTime, strStudyTime);
PutAndInsertString(pDcmDataset, DCM_SeriesDate, strSeriesDate);
PutAndInsertString(pDcmDataset, DCM_SeriesTime, strSeriesTime);
PutAndInsertString(pDcmDataset, DCM_InstanceCreationDate, strCreationDate);
PutAndInsertString(pDcmDataset, DCM_InstanceCreationTime, strCreationTime);
PutAndInsertString(pDcmDataset, DCM_ContentDate, strCreationDate);
PutAndInsertString(pDcmDataset, DCM_ContentTime, strCreationTime);
PutAndInsertString(pDcmDataset, DCM_AcquisitionDate, strCreationDate);
PutAndInsertString(pDcmDataset, DCM_AcquisitionTime, strCreationTime);
}
//R=right
//L=left
//U=unpaired
//B=both
void CSDCMImage::WriteLaterality(DcmDataset* pDcmDataset, OFString strLaterality, OFString strImageLaterality)
{
//Must be set when All image same laterality
//PutAndInsertString(pDcmDataset, DCM_Laterality, strLaterality);
//Just Image
PutAndInsertString(pDcmDataset, DCM_ImageLaterality, strImageLaterality);
}
void CSDCMImage::WriteLaterality(DcmDataset* pDcmDataset, QString strLaterality, QString strImageLaterality)
{
//Just Image
PutAndInsertString(pDcmDataset, DCM_ImageLaterality, strImageLaterality);
}
void CSDCMImage::WriteImageType(DcmDataset* pDcmDataset, OFString strImageType)
{
OFString strData;
if(strImageType.empty()==true)
{
strData = "DERIVED";
strData += char(0x5c);
strData += "PRIMARY";
}
else
{
strData = strImageType.c_str();
}
PutAndInsertString(pDcmDataset, DCM_ImageType, strData);
}
void CSDCMImage::WriteImageType(DcmDataset* pDcmDataset, QString strImageType)
{
QString strData;
if(strImageType.isEmpty()==true)
{
strData = "DERIVED";
strData += char(0x5c);
strData += "PRIMARY";
}
else
{
strData = strImageType;
}
PutAndInsertString(pDcmDataset, DCM_ImageType, strData);
}
void CSDCMImage::WriteDeviceInfo(DcmDataset* pDcmDataset)
{
CommonData* pCommonData = MainWindow::GetCommonData();
QString strManufacturer = "Storage Solution for Doctors co,.ltd.";
QString strManufacturerModelName = "SmartQuadra";
QString strStationName = pCommonData->GetStationName();
QString strInstitutionName = pCommonData->GetInstitutionName();
QString strDeviceSerialNumber = "Device1.2";
QString strSoftwareVersions = "V2.1";
//General Equipment Info
PutAndInsertString(pDcmDataset, DCM_Manufacturer, strManufacturer);
PutAndInsertString(pDcmDataset, DCM_ManufacturerModelName, strManufacturerModelName);
PutAndInsertString(pDcmDataset, DCM_StationName, strStationName);
PutAndInsertString(pDcmDataset, DCM_InstitutionName, strInstitutionName);
//Device Information
PutAndInsertString(pDcmDataset, DCM_DeviceSerialNumber, strDeviceSerialNumber);
PutAndInsertString(pDcmDataset, DCM_SoftwareVersions, strSoftwareVersions);
}
void CSDCMImage::SetTransferSyntax(E_TransferSyntax nTransferSyntax)
{
m_TransferSyntaxOutput = nTransferSyntax;
}
void CSDCMImage::CharacterSetConversion(DcmDataset* pDcmDataset)
{
CommonData* pCommonData = MainWindow::GetCommonData();
QString strEnc = pCommonData->GetDICOMCharacterSet();
int i=0;
for (i = 0; i<(int)pDcmDataset->card(); i++)
{
DcmElement* pElement = NULL;
OFString strData;
DcmTagKey dcmKey;
DcmTag tag;
pElement = pDcmDataset->getElement(i);
tag = pElement->getTag();
// int nGroup = tag.getGroup();
// int nElement = tag.getElement();
DcmEVR vr;
vr = pElement->getVR();
if(vr==EVR_PN || vr==EVR_LO)
{
OFString strData;
OFString strConv;
pElement->getOFStringArray(strData);
//int nRet = 0;
//nRet = CSDCMStringEncoder::ConvertString(strData, strConv, strEncSystem, strEncDICOM);
if(strEnc=="EUC-KR")
{
//strConv = CharConvert::Convert(strData.data(), strEnc).toStdString().c_str();
QString strQData = strData.data();
QByteArray strArray = CharConvert::UTF8toEUCKR(strQData);
strConv = strArray.data();
//strConv = strQConv.toStdString().c_str();
//strConv = strData;
pElement->putOFStringArray(strConv);
}
}
else if(vr==EVR_SQ)
{
//CharacterSetConversion(pElement);
}
}
}
list<OFString>* CSDCMImage::GetListInputFile()
{
return m_pListInputFile;
}