[Dcmlib] converting itk,vtk or any other 3D images into dicom.
jean-michel.rouet at philips.com
jean-michel.rouet at philips.com
Thu Nov 4 16:33:31 CET 2004
Tout simplement car je n'ai pas updaté ma version d'ITK, et dans la mienne
ces classes n'existent pas ;-)
Bon je suis parvenu a ecrire les images correctement.
L'idée est la suivante:
gdcm::Header *h1 = new gdcm::Header(adicomfile);
... replace some headers ...
uint8_t *myData = (uint8_t *) malloc(sliceSize);
h1->ReplaceOrCreateByNumber(myData, 0, h1->GetGrPixel(),
h1->GetNumPixel()); // !!! VERY IMPORTANT
h1->SetImageDataSize( sliceSize );
gdcm::File *f1 = new gdcm::File(h1);
f1->SetImageData( myData, sliceSize); // !!! IMPORTANT TOO
for (int z=0; z<sizez; z++) {
h1->ReplaceOrCreateByNumber( gdcm::Util::Format("%g\\%g\\%g",
orig[0],orig[1],orig[2]+z*spacing[0]), 0x0020, 0x0032);// im pos
h1->ReplaceOrCreateByNumber( gdcm::Util::Format("%f",
orig[2]+z*spacing[0]), 0x0020, 0x1041);// slice location
h1->ReplaceOrCreateByNumber( gdcm::Util::Format("%d",
z+1), 0x0020,
0x0013);// instance
// copy the content !!!
memcpy(myData,imageData+z*sizex*sizey,sliceSize);
// And write
char filename[512];
sprintf (filename, "%s/IMAGE_%05d.dcm", directory.c_str(), z);
std::cout << "Writing file " << filename;
f1->WriteDcmExplVR(filename);
std::cout << " OK" << std::endl;
}
Ca ca fonctionne.
Ce que je suis en train de regarder maintenant, c'est comment le faire
sans lire d'image dicom pour remplir les champs par defaut...
Il faudrait peut etre alors revoir le constructeur de gdcm::Header car si
on ne lui passe pas d'argument, il n'initialise pas les champs
correctement.
Pour l'instant je m'en tire en lui passant un nom de fichier qui n'existe
pas, mais ce n'est pas tres propre...
Il me reste aussi a mettre des champs de SeriesUID et autre correctement
pour que l'image soit reconnue comme une sequence de dicom, et sur ce
point je n'ai pas trop de connaissances a priori.
Des que ca fonctionne correctement, je poste le code au cas ou des gens
sont interessés.
JM
Jean-Michel,
Juste au passage je vois du ITK, pourquoi tu n'utilises
pas directement
les classes itkGDCMImageIO, itkGDCMSeriesFileNames ?
Elles sont teste'es toutes les nuits.
Mathieu
More information about the Dcmlib
mailing list