1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4 <META http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
5 <TITLE>Gdcm News</TITLE>
11 <!--#######################################################################-->
12 <H1>Gdcm News</a></H1>
14 <!--#######################################################################-->
16 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
18 <A CLASS="anchor" NAME="missing">
19 <B>Missing features</B></A>
21 We know the following are missing; don't loose time looking for them ...<br>
22 We know they could be helpfull. We shall add them some day.<br>
23 Any contribution is welcome.
27 <LI> gdcm doesn't read yet <TT>JPEG-LS</TT> encoded files.
29 We said '<TT>JPEG-LS</TT>', not Lossless Jpeg ...<br>
30 [<TT>JPEG-LS</TT> is the basis for new lossless/near-lossless compression
31 standard for continuous-tone images intended for <TT>JPEG2000</TT>.
32 The standard is based on the LOCO-I algorithm
33 (LOw COmplexity LOssless COmpression for Images)
34 developed at Hewlett-Packard Laboratories]
36 <LI> gdcm doesn't read yet all <TT>JPEG2000</TT> encoded files.
38 But we are working on it (a lot of troubles with Jasper).
39 Update: as of Oct 10 2005, we are currently investigating another library:
40 openjpeg. The problem still exist for this library but one of the author
41 is currently working on it:
42 http://www.openjpeg.org/forum/viewtopic.php?t=18
44 <LI> gdcm doesn't read yet <TT>MPEG2</TT> encoded files.
49 <LI> Allow user to tell <TT>gdcm::Document</TT> constructor he just wants
50 to load a given list of <TT>DocEntries</TT>
51 (to save CPU time and RAM space)
52 <LI> Allow 'frame by frame' reading (should be helpfull for huge
54 <LI> Allow subvolume selection / frames selection before reading.
55 <LI> Expose Read/Decompression mechanisms to allow user getting
56 information from <tt>DICOMDIR</TT> <br> -or from his own Data Base-
57 and reading his images without parsing
58 the header, one more time.
62 <LI> Allow user to tell the Writer he doesn't want to write down
63 <TT>SeqEntry</TT> (if any)
64 <LI> Allow user to tell the Writer he doesn't want to write down
65 <TT>Shadow groups</TT> (if any)
66 <LI> Allow user to tell the Writer which compression mode he wants<br>
67 (Right now, no one is available)
68 <LI> Allow user to tell the Writer he wants to split a
69 <TT>Multiframe</TT> image into a serie of
70 <TT>Single frame</TT> images.
71 <LI> Allow user to tell the Writer he wants to agregate a
72 Serie of <TT>Single frame</TT> images into a
73 <TT>Multiframe</TT> image.
77 <LI> Full <TT>Icon Image</TT> management (Read and Write)
78 <LI> Full <TT>Overlays</TT> management (Read and Write) <br>
79 both for '<TT>ACR-NEMA</TT> style' (using groups <TT>0x6000</TT>
80 and next) and '<TT>DICOM V3</TT> style' (using Sequences)
82 <LI> <TT>DICOMDIR</TT>
84 <LI> <TT>DICOMDIR</TT> full management (not limited to
85 <TT> PATIENT</TT>/<TT>STUDY</TT>/<TT>SERIE</TT>/<TT>IMAGE</TT>)
86 <LI> Allow user to add an entry (belonging to the file header Dicom
87 entries)to the default entry list, before
88 making a <TT>DICOMDIR</TT> from a root directory
89 <LI> Allow user to add an entry of his owns (for instance an <TT>Icon</TT>
90 to each image, or to each Serie).
95 <LI> An accurate <TT>SerieHelper</TT> <br>
96 Right now <TT>SerieHelper</TT> only works on 'bona fide Series', and
97 breaks on wrongly forged Series.<br>
98 We are still looking for any heuristics...
99 <LI> A <TT>SerieHelper</TT> that would use the <TT>DICOMDIR</TT> (if any)
100 instead of parsing all the files within the Root Directory
104 <LI> 16-bits-LUT full Management
105 <LI> User friendly management of <TT>Rescale Slope</TT> and
106 <TT>Rescale Intercept</TT>.<br>
107 (Well... Maybe it's up to the application to deal with it, not to
109 <LI> Allow manual adjunction / automatic recognition (pfff!...)
110 of the private <TT>Dicom Dictionary</TT>
111 to be used to parse <TT>Shadow groups</TT> against.
112 <LI> User friendly way of anonymizing image when Patient's name is
113 carved in the Pixels :-(
116 <!#######################################################################>
117 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
119 <A CLASS="anchor" NAME="NewsCurrentVersion">
120 <B>Current Version (CVS)</B></A>
125 <LI> <A HREF="News.html#missing">Missing Features</a>
129 <a href="uml-gdcmV1.2.pdf">gdcm UML Class Diagram</a> current version.
130 <LI> <a href= "DocCVS/html.user/index.html">User Documentation</a>
131 <LI> <a href= "DocCVS/html.developper/index.html">Developper
135 <LI> To <i>try to</i> make gdcm images PACS usable, user is now allowed to
136 gdcm what kind of image he wants to write, using : <br>
137 <TT>void FileHelper::SetContentType (ImageContentType c);</TT> <br>
138 Four different types are identify (probabely more will be added) :
141 1) user created ex nihilo his own image and wants to write it as a Dicom image.<br>
142 c : <TT>USER_OWN_IMAGE</TT>
144 2) user modified the pixels of an existing image, using mathematical operations.<br>
145 c : <TT>FILTERED_IMAGE</TT>
147 3) user created a new image, using existing images (eg MIP, MPR, cartography image)<br>
148 c : <TT>CREATED_IMAGE</TT>
150 4) user modified/added some tags *without processing* the pixels (anonymization, etc)<br>
151 c : <TT>UNMODIFIED_PIXELS_IMAGE</TT>
153 <LI> Stupid difference between <TT>gdcm::ValEntry</TT>
154 and <TT>gdcm::BinEntry</TT> removed. <br>
155 Only <TT>gdcm::DataEntry</TT> exist, now.
156 Should have been considered as a 'Bug Fix'.<br>
157 Actually, it's an API breaking modification ...
160 <TT>std::string const &DataEntry::GetString() const</TT><br>
161 returns as a string (when possible) the value of the DataEntry
163 <TT>void DataEntry::SetString(std::string const &value)</TT><br>
164 Sets the 'value' of a DataEntry, passed as a std::string
166 <TT>void DataEntry::SetBinArea( uint8_t *area, bool self ) </TT><br>
167 Sets the value (non string) of the current Dicom DataEntry
169 <TT>void DataEntry::CopyBinArea( uint8_t *area, uint32_t length )</TT><br>
170 Inserts the value (non string) into the current DataEntry
172 <TT>void DataEntry::SetValue(const uint32_t &id, const double
174 Inserts the elementary (non string) value into the current
175 (multivaluated) DataEntry, at the <TT>id></TT> position.
177 <TT>double DataEntry::GetValue(const uint32_t &id) const </TT><br>
178 returns, as a double one of the values (when entry is
179 multivaluated), identified by its index <TT>id</TT>.
182 <TT>DocEntrySet::GetEntryValue()</TT> replaced by
183 <TT>DocEntrySet::GetEntryString()</TT> <br>
184 <LI> SerieHelper : <br>
185 Add some methods, to split a 'SingleSerieUID' Fileset into
186 'Extra Coherent' FileSets. <br>
187 They return a std::map of 'Filesets' (actually : std::vector
189 The key is the 'Orientation', the 'Position'
190 or the value of a user choosen 'Tag' <br>
191 - <TT>XCoherentFileSetmap SplitOnOrientation(FileList *fileSet);
193 - <TT>XCoherentFileSetmap SplitOnPosition(FileList *fileSet);
195 - <TT>XCoherentFileSetmap SplitOnTagValue(FileList *fileSet,
196 uint16_t group, uint16_t element);
198 These methods must be called by user, depending on what he wants
199 to do, at application time.- *he* only knows what his Series
201 <LI> To avoid memory leaks and seg faults the user intended classes
202 use now a Reference Counter.<br>
204 <LI> <TT>new()</TT> and <TT>delete()</TT> are replaced by
205 <TT>New()</TT> and <TT>Delete()</TT>
206 <LI> <TT>Register()</TT> and <TT>Unregister()</TT> methods are
208 <LI> --> Well ... People from ITK don't seem to agree too much with
210 They demand to be allowed to allocate gdcm objects in the stack as
211 well, not only in the heap.
216 <LI> API breaking modifications (since previous version)
218 <LI> Stupid difference between <TT>gdcm::ValEntry</TT>
219 and <TT>gdcm::BinEntry</TT> removed. <br>
220 Only <TT>gdcm::DataEntry</TT> exist, now. <br>
222 ValEntry(DictEntry *e);
223 BinEntry(DictEntry *e);
224 -->DataEntry *New(uint16_t group,uint16_t elem, VRKey const &vr);
226 std::string const &ValEntry::GetValue() const;
227 std::string const &BinEntry::GetValue() const;
228 -->std::string const &DataEntry::GetString() const;
230 uint8_t *BinEntry::GetBinArea();
231 -->uint8_t *DataEntry::GetBinArea();
233 void ValEntry::SetValue(std::string const &value);
234 void BinEntry::SetValue(std::string const &value);
235 -->void DataEntry::SetString(std::string const &value);
237 void BinEntry::SetBinArea( uint8_t *area, bool self = true );
238 -->void DataEntry::SetBinArea( uint8_t *area, bool self = true );
240 void ValEntry::CopyValEntry(uint16_t gr, uint16_t el);
241 -->void DataEntry::CopyDataEntry(uint16_t gr, uint16_t el, VRKey const &vr);
248 DocEntry *p3 = item2->GetDocEntry(0x0018,0x0050);
249 if( !p3 ) return false;
250 ContentEntry *entry2 = dynamic_cast<ContentEntry *>(p3);
251 std::string thickness = entry2->GetValue();
254 DocEntry *p3 = item2->GetDocEntry(0x0018,0x0050);
255 if( !p3 ) return false;
256 DataEntry *entry2 = dynamic_cast<DataEntry *>(p3);
257 std::string thickness = entry2->GetString();
261 <LI> Avoid tons of CPU time consuming accesses to DICOM Dictionnary
263 DataEntry *FileHelper::CopyDataEntry(uint16_t group, uint16_t elem);
264 -->DataEntry *FileHelper::CopyDataEntry(uint16_t group, uint16_t elem,
265 const VRKey &vr = GDCM_VRUNKNOWN);
267 void FileHelper::CheckMandatoryEntry(uint16_t group, uint16_t elem, std::string value);
268 -->void FileHelper::CheckMandatoryEntry(uint16_t group, uint16_t elem, std::string value,
269 const VRKey &vr = GDCM_VRUNKNOWN);
271 void FileHelper::SetMandatoryEntry(uint16_t group, uint16_t elem, std::string value);
272 -->void FileHelper::SetMandatoryEntry(uint16_t group, uint16_t elem, std::string value,
273 const VRKey &vr = GDCM_VRUNKNOWN);
275 void FileHelper::CopyMandatoryEntry(uint16_t group, uint16_t elem, std::string value);
276 -->void FileHelper::CopyMandatoryEntry(uint16_t group, uint16_t elem, std::string value,
277 const VRKey &vr = GDCM_VRUNKNOWN);
281 For multivaluated numeric DataEntries
282 -->void DataEntry::SetValue(const uint32_t &id,const double &val);
283 -->double DataEntry::GetValue(const uint32_t &id) const;
284 -->uint32_t DataEntry::GetValueCount() const;
286 For converting 'Decimal String'
287 -->bool GetDSValue(std::vector <double> &valueVector);
290 <LI> Avoid too many source file modifications from gdcm1.2 to gdcm1.3
294 #define ValEntry DataEntry
295 #define BinEntry DataEntry
297 #define GetEntryValue(g,e) GetEntryString(g,e)
298 #define GetEntryForcedAsciiValue(g,e) GetEntryString(g,e)
300 #define GetValEntry(g,e) GetDataEntry(g,e)
301 #define GetBinEntry(g,e) GetDataEntry(g,e)
302 #define GetValue() GetString()
304 #define InsertValEntry(v,g,e,vr) InsertEntryString(v,g,e,vr) // warning mind the VR!
305 #define InsertBinEntry(b,l,g,e,vr) InsertEntryBinArea(b,l,g,e,vr)
307 #define SetValEntry(c,g,e) SetEntryString(c,g,e) | !!
308 #define SetValEntry(c,en) SetEntryString(c,en) | !!
310 #define SetBinEntry(c,l,en) SetEntryBinArea(c,l,en) | !!
311 #define SetBinEntry(c,l,g,e) SetEntryBinArea(c,l,g,e) | !!
313 #define NewValEntry(g,e,vr) NewDataEntry(g,e,vr)
314 #define NewBinEntry(g,e,vr) NewDataEntry(g,e,vr)
321 <LI> Implicit VR - Big Endian (G.E Private) Transfert Syntax 16 Bits
322 images are now read correctly.
323 <LI> File::GetZOrigin() returns accurate result in any case.
330 <LI> Use of <TT>Implicit Value Representation</TT> writting mode may
331 causes troubles, when there are some <TT>SQ</TT> belonging to a
332 <TT>Shadow Group</TT>. <br>
333 Better you use <TT>Explicit Value Representation</TT> writting mode ...
334 <LI> Troubles on 'Big endian' processors (i.e. Apple/Motorola, SunSparc
335 ...) when writting 16 Bits images.
336 <LI> Troubles on 64-bits processors.
346 <!#######################################################################>
347 <A CLASS="anchor" NAME="NewsPreviousVersions">
348 <!#######################################################################>
350 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
352 <A CLASS="anchor" NAME="NewsVersion1_1">
353 <B>Version 1.1 (September 14 2005)</B></A>
358 <a href="Doc1.0/uml-gdcmV1.0.pdf">gdcm 1.1 UML Class Diagram</a> version.
359 <LI> <a href= "Doc1.0/html.user/index.html">User Documentation</a>
360 <LI> <a href= "Doc1.0/html.developper/index.html">Developper
365 <TT>gdcm::Dict:AddDict(std::string fullPathPrivateDictionaryFileName)</TT>
367 <TT>gdcm::Dict::RemoveDict(std::string fullPathPrivateDictionaryFileName)</TT>
369 to allow user to choose the 'Private Dictionary' he wants to work with.
371 One can dream about a better API;<br>
372 This one allow right now anybody to see very easyly if the use
373 of a given private dicom dictionary is of any help or not.
376 <TT>PrintFile</TT> has now a new command line argument manager option :<br>
377 <TT>dict=fullPathNamePrivateDictionaryFile</TT><br>
378 to allow user to see with no extra coding what differences
379 makes the use or not of a private Dicom Dictionary.<br>
380 e.g. : use it as follow <br>
381 <TT>PrintFile filein=myGEdicomFile.dcm
382 dict=/user/userName/gdcm/Dicts/GEMS-Advance.dic</TT>
385 (Not a great one ...)
386 Stupid method names : <br><TT>DicomDir::WriteDicomDir()</TT>
387 and <TT>DicomDir::AnonymizeDicomDir()</TT> <br>replaced by : <br>
388 <TT>DicomDir::Write()</TT>
389 and <TT>DicomDir::Anonymize()</TT>
392 void Document::AddForceLoadElement(uint16_t group, uint16_t elem);
394 allows user to tell <TT>gdcm::Document</TT> Loader he wants
395 to force the loading of a given set of <TT>DocEntries</TT>,
396 even if their length exceeds the current
397 <TT>MAX_SIZE_LOAD_ELEMENT_VALUE</TT>.
400 Many users expect from <TT>vtkGdcmReader</TT> it 'orders' the images
401 (that's the job of <TT>gdcm::SerieHelper</TT> ...)<br>
402 When user <b>knows</b> the files with same Serie UID
403 have same sizes, same 'pixel' type, same color convention, ...
404 the right way to proceed is as follow :
406 gdcm::SerieHelper *sh= new gdcm::SerieHelper();
407 // if user wants *not* to load some parts of the file headers
408 sh->SetLoadMode(loadMode);
410 // if user wants *not* to load some files
411 sh->AddRestriction(group, element, value, operator);
412 sh->AddRestriction( ...
413 sh->SetDirectory(directoryWithImages);
415 // if user *knows* how to order his files
416 sh->SetUserLessThanFunction(userSuppliedComparisonFunction);
418 // if user wants to sort reverse order
419 sh->SetSortOrderToReverse();
421 // here, we suppose only the first 'Single SerieUID' Fileset is of interest
422 // Just iterate using sh->NextSingleSerieUIDFileSet()
423 // if you want to get all of them
424 gdcm::FileList *l = sh->GetFirstSingleSerieUIDFileSet();
426 // if user is doesn't trust too much the files with same Serie UID
427 if ( !sh->IsCoherent(l) )
428 return; // not same sizes, or not same 'pixel type' -> stop
430 sh->OrderFileList(l); // sort the list
432 vtkGdcmReader *reader = vtkGdcmReader::New();
433 // if user wants to modify pixel order (Mirror, TopDown, ...)
434 // he has to supply the function that does the job
435 // (a *very* simple example is given in vtkgdcmSerieViewer.cxx)
436 reader->SetUserFunction (userSuppliedFunction);
438 // to pass a 'Single SerieUID' Fileset as produced by gdcm::SerieHelper
439 reader->SetCoherentFileList(l);
442 You can see a full example in <TT>vtk/vtkgdcmSerieViewer.cxx</TT><br>
445 <TT>vtkgdcmSerieViewer dirname=Dentist mirror</TT><br>
446 <TT>vtkgdcmSerieViewer dirname=Dentist reverse</TT><br>
447 <TT>vtkgdcmSerieViewer dirname=Dentist reverse topdown</TT><br>
451 <LI> <TT>vtkGdcmReader::SetUserFunction (userSuppliedFunction)</TT><br>
453 <TT>void userSuppliedFunction(uint8_t *imageData, File *f);</TT><br>
454 allows user to reorganize the pixels of each image just after reading
455 it (to mirror, or topdown the image, for instance)<br>
456 Note : <TT>uint8_t *</TT> doesn't mean it works only on 8 Bits images.
457 <br> It's for prototyping. Feel free to cast it.
460 SerieHelper::SetUserLessThanFunction(userSuppliedComparisonFunction)
461 </TT><br> with : <br>
462 <TT>bool userSuppliedComparisonFunction(File *, File *);</TT><br>
463 allows user -when he knows more about his files than gdcm does-
464 to give his own comparison function.
465 <LI> <TT>SerieHelper::SetSortOrderToReverse</TT> allows user to ask
466 to sort the Files reverse order.
467 <LI> <TT>SerieHelper::AddRestriction</TT> has now a new constructor<br>
468 <TT>AddRestriction(group, element, value, operator);</TT><br>
469 allows user to exclude some files from the sorting, according to
470 any comparison operator <br>
471 (<TT>GDCM_EQUAL</TT>, <TT>GDCM_DIFFERENT</TT>,
472 <TT>GDCM_GREATER</TT>, <TT>GDCM_GREATEROREQUAL</TT>,
473 <TT>GDCM_LESS</TT>, <TT>GDCM_LESSOREQUAL</TT>), not only on the
476 <LI> <TT>AnonymizeNoLoad</TT> used with <TT>dirin=inputDirectoryName</TT>
477 anonymizes all the files within the given Directory.
479 User may also choose extra elements he wants to rub out: <br>
480 <TT>rubout=listOfElementsToRubOut</TT><br>
481 with <tt>listOfElementsToRubOut : group1-elem1,group2-elem2,
482 ...</TT> (in hexa, no space within the list )
484 <LI> <TT>gdcm::SerieHelper()</TT> has a new method
485 <TT>void AddGdcmFile(File *header)</TT>, that allows aware user to
486 create a '<TT>FileList</TT>' (actually a
487 <TT>std::vector< File* > </TT>).<br>
488 The <TT>FileList</TT> created this way will be the
489 'first one' in the <TT>gdcm::FileHelper()</TT> (retrieve it with
490 <TT>FileList *GetFirstCoherentFileList()</TT> ).<br>
491 It may be sorted using <TT>OrderFileList</TT>.<br>
492 No 'coherence check' will be performed on this <TT>FileList</TT>
494 It may be passed to a <TT>vtkGdcmReader</TT>
495 (to avoid parsing twice the files)
497 <LI> <TT>vtkGdcmReader</TT> can now get the result of
498 <TT>gdcm::SerieHelper</TT> (to avoid parsing twice the files)<br>
499 Proceed as follow :<br>
501 gdcmSerieHelper *sh = new gdcmSerieHelper();
502 sh->SetDirectory(myImageDirectory, true);
503 gdcmFileList *l = s->GetFirstCoherentFileList();
506 vtkGdcmReader *gr = new vtkGdcmReader();
507 gr->SetCoherentFileList(l);
510 This works with a directory that contains only one '<TT>Serie</TT>'
511 (same <TT>Serie UID</TT> for all the images).<br>
512 If it contains more than one <TT>Serie</TT>, you'll have to loop
513 on the Series, using <TT>GetNextCoherentFileList()</TT>;<br>
514 It will be up to the user to delete the <TT>gdcm::File</TT>.
516 See <TT>vtkgdcmSerieViewer</TT> for an example.
518 <LI> Both <TT>vtkgdcmViewer</TT> and <TT>vtkgdcmViewer2</TT>
519 are available to allow easy displaying of single/multiframe
520 GreyLevel/RGB/PaletteColor images<br><br>
521 <LI> <TT>DICOMDIR</TT> anonymiser (<TT>Load</TT> and <TT>Noload</TT> mode)
523 <LI> Because the <TT>gdcm::DicomDir::Load()</TT> method may be used
524 either for loading an already made <TT>DICOMDIR</TT> file or for
525 parsing all the dicom files with a given root directory we
526 syntaxically separated the operations: <br>
527 For loading an already made <TT>DICOMDIR</TT> file, use : <br>
529 gdcm::DicomDir *d = new gdcm::DicomDir();
530 d->SetFileName(fileName);
534 For parsing all the dicom files within a given root directory, use :<br>
536 gdcm::DicomDir *d = new gdcm::DicomDir();
537 d->SetDirectoryName(dirName);
541 <b>Don't</b> use any longer old deprecated style: <br>
543 gdcm::DicomDir *d = new gdcm::DicomDir();<br>
544 d->SetParseDir(true); // </TT>or <TT>d->SetParseDir(false);<br>
545 d->Load( fileName );<br>
548 <LI> User is now allowed to tell <TT>gdcm::Document</TT> constructor
549 he doesn't want to deal with <TT>SeqEntry</TT>
550 (every time it's possible, i.e for 'true length' Sequences) <br>
551 and/or he doesn't want to deal with <TT>Shadow groups</TT>
552 (every time it's possible i.e. when element <TT>0x0000</TT>
553 exists for this Group) <br>
554 or he doesn't want to deal with <TT>SeqEntry</TT> that belong to a
555 <TT>Shadow group</TT> (every time it's possible
556 -'true length' Sequence-)<br>
559 gdcm::File *f = new gdcm::File();
560 f->SetLoadMode(NO_SEQ); | depending on what
561 f->SetLoadMode(NO_SHADOW); | you want *not*
562 f->SetLoadMode(NO_SEQ | NO_SHADOW);| to load from the
563 f->SetLoadMode(NO_SHADOWSEQ); | target file
564 f->SetFileName(fileName);
567 <b>Don't</b> use any longer old deprecated style: <br>
569 gdcm::File *f = new gdcm::File(fileName);</TT> <br>
571 <LI> User is now allowed to tell <TT>gdcm::DicomDir</TT> constructor
572 he doesn't want to deal with <TT>SeqEntry</TT>
573 (every time it's possible, i.e for 'true length' Sequences) <br>
574 and/or he doesn't want to deal with <TT>Shadow groups</TT>
575 (every time it's possible i.e. when element <TT>0x0000</TT>
576 exists for this Group) <br>
577 or he doesn't want to deal with <TT>SeqEntry</TT> that belong to a
578 <TT>Shadow group</TT> (every time it's possible
579 -'true length' Sequence-)<br>
580 when he parses all the Dicom files within a given directory.<br>
583 gdcm::DicomDir *f = new gdcm::DicomDir();
584 f->SetLoadMode(NO_SEQ); | depending on what
585 f->SetLoadMode(NO_SHADOW); | you want *not*
586 f->SetLoadMode(NO_SEQ | NO_SHADOW);| to load from the files
587 f->SetLoadMode(NO_SHADOWSEQ); | within the root directory
588 f->SetDirectoryName(rootDirectoryName);
591 <b>Don't</b> use any longer old deprecated style: <br>
593 gdcm::DicomDir *dcmdir = new gdcm::DicomDir(dirName, true);</TT><br>
599 <LI> No more trouble when the 'endianess' switches within Sequences.
600 <LI> No more trouble with 'no length Sequences' belonging to a
601 <TT>Shadow Group</TT> when they are 'Implicit VR'.
602 <LI> The difference between <TT>MONOCHROME1</TT> (low values = bright,
603 high values = dark) and <TT>MONOCHROME2</TT> (low values = dark,
604 high values = bright) is now taken into account.<br>
605 It's no longer up to the user to change the pixels value
606 <LI> Writing a 'True Dicom' image after reading an <TT>ACR-NEMA</TT> image
607 does not request any longer from the user to build up
608 'manually' the Meta Elements group (<TT>0x0002</TT>)
609 <LI> Old '24 Bits' <TT>ACR-NEMA</TT> are now correctly re-written
610 in <TT>DICOM V3</TT> mode.
611 <LI> Element <TT>0x0000</TT> of <TT>Shadow groups</TT> is always forced to be a
612 <TT>ValEntry</TT> and its <TT>VR</TT> is forced to <TT>UL</TT>
616 <LI> A.P.I. breaking modifications (since previous version : <TT>1.0</TT>)
618 <LI> NEVER more API breaking modifications !!!
631 <!#######################################################################>
632 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
634 <A CLASS="anchor" NAME="NewsVersion1_0">
635 <B>Version 1.0 (Feb 14 2005)</B></A>
641 <a href="Doc1.0/uml-gdcmV1.0.pdf">gdcm 1.0 UML Class Diagram</a> version.
642 <LI> <a href= "Doc1.0/html.user/index.html">User Documentation"</a>
643 <LI> <a href= "Doc1.0/html.developper/index.html">Developper
645 <LI> Final check of the jpeg sub-library: all 'classical' jpeg
646 compressed Dicom files can be read<br>
647 <LI>All the previously gdcm-breaker images are now readable<br>
648 <LI> A huge number of memory leaks removed
649 <LI> Improvement of write process
653 <LI> A.P.I. breaking modifications (since previous version : <TT>0.6</TT>)
655 <LI> Use of <TT> namespace</TT> : all the methods formerly named
656 <TT>className::gdcmXxx()</TT> are now named <TT>className::Xxx()</TT>
657 <br> End user will have to call them as <TT>gdcm::className::Xxx() </TT>
658 <LI> a <TT>gdcm::Document</TT> is now specialized in :
660 <LI> <TT>gdcm::DicomDir</TT>
661 <LI> <TT>gdcm::File</TT>
663 <LI> a <TT>gdcm::DicomElementSet</TT> is composed of a set of
664 <TT>gdcm::DicomDocEntry</TT>
665 <LI> a <TT>gdcm::DicomDocEntry</TT> can be :
667 <LI> a <TT>gdcm::ContentEntry</TT>, specialized in :
669 <LI> <TT>gdcm::ValEntry</TT>
670 <LI> <TT>gdcm::BinEntry</TT> (no longer a specialization of
671 <TT>gdcm::ValEntry</TT>)
673 <LI> a <TT>gdcm::SeqEntry</TT>
675 <LI> Removal of useless accessors <TT>GetXxxByname</TT>, <TT>SetXxxByname</TT>
676 <LI> Renaming of accessors <TT>GetXxxByNumber</TT>, <TT>SetXxxByNumber</TT>
679 <LI> <TT>GetEntryByNumber
680
681 --> GetEntryValue</TT>
682 <LI> <TT>GetEntryLengthByNumber --> GetEntryLength</TT>
683 <LI> <TT>GetEntryOffsetByNumber --> GetEntryOffset</TT>
684 <LI> <TT>GetEntryVRByNumber
685 --> GetEntryVR</TT>
687 <LI> <TT>GetDocEntryByNumber
688 --> GetDocEntry</TT>
689 <LI> <TT>GetValEntryByNumber
690 --> GetValEntry</TT>
691 <LI> <TT>GetBinEntryByNumber
692 --> GetBinEntry</TT>
693 <LI> <TT>GetSeqEntryByNumber
694 --> GetSeqEntry</TT>
699 <!#######################################################################>
700 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
702 <A CLASS="anchor" NAME="NewsVersion0_6">
703 <B>Version 0.6 (June 8 2004)</B></A>
706 This version will be used by Insight Tool Kit
707 (<a href="http://www.itk.org">ITK</a> 2.0) at the beginning of 2005.<br>
708 It's not yet packaged ...<br><br>
709 <LI> <a href= "Doc0.6/html.user/index.html">User Documentation"</a>
710 <LI> <a href= "Doc0.6/html.developper/index.html">Developper Documentation"</a>
711 <LI> The new <TT>gdcmDocument</TT> class is a parent class of
712 <TT>gdcmHeader</TT> class and <TT>gdcmDicomDir</TT> class.
713 <LI> Massive modifications in the Class Diagram :
715 <LI> any dicom related file is a <TT>gdcmDocument</TT>
716 <LI> a <TT>gdcmDocument</TT> can be :
718 <LI> a <TT>gdcmHeader</TT>, if it contains pixel data
719 <LI> a <TT>gdcmDicomDir</TT>, if it contains only informations
720 on the files in a given directory
723 <LI> a <TT>gdcmDocument</TT> is_a <TT>gdcmElementSet</TT>,
724 composed of a set of <TT>gdcmEntry</TT> separated into :
726 <LI> <TT>gdcmValEntry</TT><br>
727 a specialization of <TT>gdcmValEntry</TT>, for 'non
728 <TT>std::string</TT> representable' values is
729 <TT>gdcmBinEntry</TT>
730 <LI> <TT>gdcmSeqEntry</TT> (VR = <TT>SQ</TT>, i.e Dicom Sequences)<br>
731 they are dealt as tree-like structures :<br>
732 - a <TT>gdcmSeqEntry</TT> is considered as a set
733 of <TT>gdcmSQItem</TT>,<br>
734 - a <TT>gdcmSQItem</TT> is_a <TT>gdcmElementSet</TT>, composed
735 of <TT>gdcmDocEntries</TT>, recursively <br>
738 <LI> Improvement of the jpeg sub-library: jpeg
739 compressed Dicom files (lossless and lossy)
740 might be read (check-it out)
743 <!#######################################################################>
744 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
746 <A CLASS="anchor" NAME="NewsVersion0_4">
747 <B>Version 0.4 (February 6 2004)</B></A>
751 <LI> <a href="Doc0.4/uml-gdcmV0.4.pdf">gdcm 0.4 UML Class Diagram</a>.
752 <LI> <a href= "Doc0.4/html.user/index.html">User Documentation"</a>
753 <LI> <a href= "Doc0.4/html.developper/index.html">Developper Documentation </a>
755 <LI> Introduction of a jpeg sub-library: some very simple jpeg-lossy
756 compressed Dicom files might be working (check-it out).
757 <LI> And also, fewer memory leaks, cleaned-up stl usage (should work
758 with gcc-3.x), python disutil installer (see file setup.py)
759 supporting both Swig and vtk wrapping.
760 <LI> Introduction of a RLE (Run-Time Encoding) library
761 <LI> Color images (RGB or Palette Color) are dealt with
762 <LI> Confusing names <TT>gdcmPatient</TT>, <TT>gdcmStudy</TT>,
763 <TT>gdcmSerie</TT>, <TT>gdcmPatient</TT> changed to
764 <TT>gdcmDicomDirPatient</TT>, <TT>gdcmDicomDirStudy</TT>,
765 <TT>gdcmDicomDirSerie</TT>, <TT>gdcmDicomDirPatient</TT>
769 <!#######################################################################>
770 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
772 <A CLASS="anchor" NAME="NewsVersion0_3">
773 <B>Version 0.3 (July 8 2003)</B></A>
776 <LI> <TT>gdcmFile</TT> class now enables acces to the data
777 i.e. the image[s] content. Previously only parsing of the
778 Dicom header was available through usage of <TT>gdcmHeader</TT>
780 <LI> a <A HREF="http://public.kitware.com/VTK/">VTK</A> plugin
781 of gdcm is now available through the <TT>vtkGdcmReader</TT>
782 vtk class (see it as a vtk wrapper of gdcm), which enables
784 <LI> Loading of a single image,
785 <LI> Loading of a stack of images from multiple Dicom files,
786 <LI> this class is wrapped for vtkPython (by using native vtk
789 <LI> Introduction of a jpeg sub-library: lossless-jpeg
790 compressed Dicom files work.
791 <LI> <TT>vtkgdcmViewer</TT> allows easy displaying of single/multiframe
792 GreyLevel/RGB/PaletteColor images
795 <!#######################################################################>
796 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
798 <A CLASS="anchor" NAME="NewsVersion0_1">
799 <B>Version 0.1 (April 1 2003)</B></A>
801 <!#######################################################################>
802 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
804 <A CLASS="anchor" name="NewsVersion0_1">
805 <B>Version 0.0 (March 14 2003)</B></A>
807 <HR size="1"><ADDRESS style="align: right;"></ADRESS>