JPEG转为DICOM文件

  1 //======================================================================================

  2 // NanJing ChunRen L.T.D

  3 // Created by HGB

  4 //======================================================================================

  5 /*convert.h*/

  6 

  7 

  8 #ifdef __cplusplus

  9 extern "C" {

 10 #endif

 11 

 12 

 13 // 下列部分用于定义SCU/SCP回调函数

 14 

 15 //typedef void (__stdcall * STORESCPCALLBACK)(T_StoreProgress* progress, LPCSTR filename);

 16 

 17 // 下列函数用于处理SCU高级网络服务

 18 /*BOOL __stdcall dicom_echoscu_execute(LPCSTR servername, int serverport, 

 19           LPCSTR servertitle, LPCSTR clienttitle);

 20 BOOL __stdcall dicom_storescu_execute(LPCSTR servername, int serverport, 

 21            LPCSTR servertitle, LPCSTR clienttitle, 

 22            LPCSTR filelist, STORESCUCALLBACK callback);*/

 23 

 24 // 下列函数用于处理SCP高级网络服务

 25 //int __declspec(dllexport) IncInt(int params);

 26 bool __stdcall jpg2dcm(LPSTR BmpSrc, LPSTR DcmDest, LPSTR PatientName, LPSTR PatientSex);

 27 //int __stdcall(dllexport) IncInt(int params);

 28 

 29 

 30 #ifdef __cplusplus

 31 }

 32 #endif

 33 

 34 

 35 #ifdef __cplusplus

 36 

 37 extern "C" {

 38 #endif

 39 

 40 

 41 // 下列部分用于定义SCU/SCP回调函数

 42 

 43 //typedef void (__stdcall * STORESCPCALLBACK)(T_StoreProgress* progress, LPCSTR filename);

 44 

 45 // 下列函数用于处理SCU高级网络服务

 46 /*BOOL __stdcall dicom_echoscu_execute(LPCSTR servername, int serverport, 

 47           LPCSTR servertitle, LPCSTR clienttitle);

 48 BOOL __stdcall dicom_storescu_execute(LPCSTR servername, int serverport, 

 49            LPCSTR servertitle, LPCSTR clienttitle, 

 50            LPCSTR filelist, STORESCUCALLBACK callback);*/

 51 

 52 // 下列函数用于处理SCP高级网络服务

 53 //int __declspec(dllexport) IncInt(int params);

 54 bool __stdcall jpg2dcm(LPSTR BmpSrc, LPSTR DcmDest, LPSTR PatientName, LPSTR PatientSex);

 55 //int __stdcall(dllexport) IncInt(int params);

 56 

 57 

 58 #ifdef __cplusplus

 59 }

 60 

 61 #endif

 62 

 63 

 64 

 65 

 66 //======================================================================================

 67 // NanJing ChunRen L.T.D

 68 // Created by HGB

 69 //======================================================================================

 70 

 71 

 72 /*convert.cpp*/

 73 

 74 

 75 // convert.cpp : Defines the entry point for the DLL application.

 76 //

 77 

 78 #include "stdafx.h"

 79 //#include <afx.h>

 80 #include "convert.h"

 81 #include "xImageDCM.h"

 82 

 83 BOOL APIENTRY DllMain( HANDLE hModule, 

 84                        DWORD  ul_reason_for_call, 

 85                        LPVOID lpReserved

 86                      )

 87 {

 88     switch (ul_reason_for_call)

 89     {

 90         case DLL_PROCESS_ATTACH:

 91         case DLL_THREAD_ATTACH:

 92         case DLL_THREAD_DETACH:

 93         case DLL_PROCESS_DETACH:

 94             break;

 95     }

 96     return TRUE;

 97 }

 98 

 99 

100 int IncInt(int params)

101 {

102     return params+1;

103 }

104 

105 

106 bool __stdcall jpg2dcm(LPSTR BmpSrc, LPSTR DcmDest, LPSTR PatientID, LPSTR PatientName, 

107                        LPSTR PatientSex, LPSTR StudyDate)

108 {

109     CxImageDCM dcm;

110     //CString    m_sBmpSrcFile;

111     //CString    m_sDcmDestFile;

112     //dcm.Load(BmpSrc,CXIMAGE_FORMAT_BMP);

113     dcm.Load(BmpSrc,CXIMAGE_FORMAT_JPG);

114     if(!dcm.IsValid()){

115         return false;

116     }else{

117         /*m_sBmpSrcFile=filename;

118         m_sDcmDestFile=m_sBmpSrcFile;

119         m_sDcmDestFile.TrimRight(filename);

120         m_sDcmDestFile+=_T("dcm");*/

121         //if(dcm.SaveAsDCM(m_sDcmDestFile))

122         if(dcm.SaveAsDCM(DcmDest, PatientID, PatientName, PatientSex, StudyDate))

123         {

124             return true;

125         }

126         else

127         {

128             return false;

129         }

130     }

131 }

132 

133 

134 

135 

136 //======================================================================================

137 // NanJing ChunRen L.T.D

138 // Created by HGB

139 //======================================================================================

140 

141 // xImageDCM.cpp: implementation of the CxImageDCM class.

142 //

143 //////////////////////////////////////////////////////////////////////

144 #include "StdAfx.h"

145 //#include "DCMConverter.h"

146 #include "xImageDCM.h"

147 

148 

149 #include "osconfig.h"    /* make sure OS specific configuration is included first */

150 

151 

152 #ifdef HAVE_GUSI_H

153 #include <GUSI.h>

154 #endif

155 

156 #include "dctk.h"          /* for various dcmdata headers */

157 #include "dcdebug.h"       /* for SetDebugLevel */

158 #include "cmdlnarg.h"      /* for prepareCmdLineArgs */

159 #include "dcuid.h"         /* for dcmtk version name */

160 #include "dcrledrg.h"      /* for DcmRLEDecoderRegistration */

161 

162 #include "dcmimage.h"      /* for DicomImage */

163 #include "digsdfn.h"       /* for DiGSDFunction */

164 #include "diciefn.h"       /* for DiCIELABFunction */

165 

166 #include "ofconapp.h"      /* for OFConsoleApplication */

167 #include "ofcmdln.h"       /* for OFCommandLine */

168 

169 #include "diregist.h"      /* include to support color images */

170 #include "ofstd.h"         /* for OFStandard */

171 

172 #include "djdecode.h"     /* for dcmjpeg decoders */

173 #include "dipijpeg.h"     /* for dcmimage JPEG plugin */

174 #include "dipitiff.h"     /* for dcmimage TIFF plugin */

175 #include "dipipng.h"      /* for dcmimage PNG plugin */

176 #include "zlib.h"         /* for zlibVersion() */

177 

178 #include "ofstream.h"

179 

180 

181 /*#ifdef _DEBUG

182 #undef THIS_FILE

183 static char THIS_FILE[]=__FILE__;

184 #define new DEBUG_NEW

185 #endif*/

186 

187 

188 

189 

190 //////////////////////////////////////////////////////////////////////

191 // Construction/Destruction

192 //////////////////////////////////////////////////////////////////////

193 

194 CxImageDCM::CxImageDCM()

195 {

196     //init pointers

197     pDib = pSelection = pAlpha = NULL;

198     pLayers = NULL;

199     //init structures

200     memset(&head,0,sizeof(BITMAPINFOHEADER));

201     memset(&info,0,sizeof(CXIMAGEINFO));

202     //init default attributes

203     info.dwType = 0;

204     info.nQuality = 90;

205     info.nAlphaMax = 255;

206     info.nBkgndIndex = -1;

207     info.bEnabled = true;

208     SetXDPI(96);

209     SetYDPI(96);

210 }

211 

212 CxImageDCM::~CxImageDCM()

213 { 

214 

215 }

216 

217 bool CxImageDCM::SaveAsBMP(const TCHAR *fileName)

218 {//please refer to the implementation of dcmj2pnm

219     return false;

220 }

221 

222 bool CxImageDCM::SaveAsJPG(const TCHAR* fileName)

223 {//you may also use DCMTK's JPG encoding plug-in

224     return CxImage::Save(fileName,CXIMAGE_FORMAT_JPG);

225 }

226 

227 bool CxImageDCM::LoadDCM(const TCHAR* filename)

228 {  

229     DcmFileFormat *dfile = new DcmFileFormat();

230     OFCondition cond = dfile->loadFile(filename, EXS_Unknown,

231         EGL_withoutGL,DCM_MaxReadLength,ERM_autoDetect);

232     

233     if (cond.bad()) {

234         return false;//AfxMessageBox(cond.text());

235     }

236     

237     E_TransferSyntax xfer = dfile->getDataset()->getOriginalXfer();

238     DicomImage *di = new DicomImage(dfile, xfer, 

239         CIF_AcrNemaCompatibility ,

240         0, 1);

241     

242     if (di->getStatus() != EIS_Normal)

243         return false;//AfxMessageBox(DicomImage::getString(di->getStatus()));

244     

245 

246 

247     //可改为MemoryStream操作,以替换不安全低效的临时文件

248     di->writeBMP("c:\\from_dicom.bmp",24);

249     

250     return CxImage::Load("c:\\from_dicom.bmp",CXIMAGE_FORMAT_BMP);

251     

252 }

253 

254 bool CxImageDCM::SaveAsDCM(const TCHAR* filename, const TCHAR* PatientID, 

255                            const TCHAR* PatientName, const TCHAR* PatientSex,

256                            const TCHAR* StudyDate)

257 {

258     CxImageDCM::IncreaseBpp(24);

259     char uid[100]; 

260     DcmFileFormat fileformat; 

261     DcmDataset *dataset = fileformat.getDataset(); 

262     dataset->putAndInsertString(DCM_SOPClassUID, 

263         UID_SecondaryCaptureImageStorage); 

264     dataset->putAndInsertString(DCM_SOPInstanceUID, 

265         dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT)); 

266     dataset->putAndInsertString(DCM_StudyInstanceUID , 

267         dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT)); 

268     dataset->putAndInsertString(DCM_SeriesInstanceUID , 

269         dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT)); 

270     dataset->putAndInsertString(DCM_Modality,"OT");

271     dataset->putAndInsertString(DCM_PatientID, PatientID);

272     dataset->putAndInsertString(DCM_PatientsName, PatientName);

273     dataset->putAndInsertString(DCM_PatientsSex, PatientSex);

274     dataset->putAndInsertString(DCM_StudyDate, StudyDate);

275     dataset->putAndInsertString(DCM_WindowCenter, "256");

276     dataset->putAndInsertString(DCM_WindowWidth, "128");

277         

278 //    dataset->putAndInsertUint32(DCM_MetaElementGroupLength,128);

279     dataset->putAndInsertUint16(DCM_FileMetaInformationVersion,

280         0x0001);

281     dataset->putAndInsertString(DCM_MediaStorageSOPClassUID,

282         UID_MultiframeTrueColorSecondaryCaptureImageStorage);

283     dataset->putAndInsertString(DCM_MediaStorageSOPInstanceUID,

284         dcmGenerateUniqueIdentifier(uid,SITE_INSTANCE_UID_ROOT));

285     dataset->putAndInsertString(DCM_TransferSyntaxUID,

286         UID_LittleEndianExplicitTransferSyntax);

287 

288     /*added by HGB*/

289     //dataset->findAndDeleteElement(DCM_ImplementationClassUID, OFTrue);

290     //dataset->findAndDeleteElement(DCM_ImplementationVersionName, OFTrue);

291     //end added

292 

293     //dataset->putAndInsertString(DCM_ImplementationClassUID,

294     //    dcmGenerateUniqueIdentifier(uid,SITE_INSTANCE_UID_ROOT));

295     //dataset->putAndInsertString(DCM_ImplementationVersionName,

296     //    "SEEKERSOFT1.3.01", OFTrue);

297 

298     dataset->putAndInsertString(DCM_UID,

299         UID_MultiframeTrueColorSecondaryCaptureImageStorage);

300     dataset->putAndInsertUint16(DCM_SamplesPerPixel,3);

301     dataset->putAndInsertString(DCM_PhotometricInterpretation,

302         "RGB"); 

303     dataset->putAndInsertUint16(DCM_SamplesPerPixel,3);

304     dataset->putAndInsertUint16(DCM_BitsAllocated,8);

305     dataset->putAndInsertUint16(DCM_BitsStored,8); 

306     dataset->putAndInsertUint16(DCM_HighBit,7);

307     dataset->putAndInsertUint16(DCM_PixelRepresentation,0);

308     dataset->putAndInsertUint16(DCM_PlanarConfiguration,0);

309     dataset->putAndInsertUint16(DCM_Rows,GetHeight());

310     dataset->putAndInsertUint16(DCM_Columns,GetWidth());

311     //add more tags here

312     /* ... */ 

313     BYTE* pData=new BYTE[GetHeight()*info.dwEffWidth];

314     BYTE* pSrc=GetBits(head.biHeight-1);

315     BYTE* pDst=pData;

316     for(long y=0; y < head.biHeight; y++){

317         memcpy(pDst,pSrc,info.dwEffWidth);

318         pSrc-=info.dwEffWidth;

319         pDst+=info.dwEffWidth;

320     }

321     dataset->putAndInsertUint8Array(DCM_PixelData, 

322         pData, GetHeight()*info.dwEffWidth); 

323     delete[] pData;

324 

325     OFCondition status = fileformat.saveFile(filename, 

326         EXS_LittleEndianImplicit,EET_UndefinedLength,EGL_withoutGL); 

327     if (status.bad()) 

328         return false;//AfxMessageBox("Error: cannot write DICOM file ");

329 

330     return true;     

331 }

 

你可能感兴趣的:(DICOM)