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 <i>Lossless Jpeg </i>...<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 <TT>MPEG2</TT> encoded files.
41 <LI> Allow user to tell <TT>gdcm::Document</TT> constructor he just wants
42 to load a given list of <TT>DocEntries</TT>
43 (to save CPU time and RAM space)
44 <LI> Allow 'frame by frame' reading (should be helpfull for huge
46 <LI> Allow subvolume selection / frames selection before reading.
47 <LI> Expose Read/Decompression mechanisms to allow user getting
48 information from <tt>DICOMDIR</TT> <br> -or from his own Data Base-
49 and reading his images without parsing
50 the header, one more time.
54 <LI> Allow user to tell the Writer he wants to split a
55 <TT>Multiframe</TT> image into a serie of
56 <TT>Single frame</TT> images.
57 <LI> Allow user to tell the Writer he wants to agregate a
58 Serie of <TT>Single frame</TT> images into a
59 <TT>Multiframe</TT> image.
63 <LI> Full <TT>Icon Image</TT> management (Read and Write)
64 <LI> Full <TT>Overlays</TT> management (Read and Write) <br>
65 both for '<TT>ACR-NEMA</TT> style' (using groups <TT>0x6000</TT>
66 and next) and '<TT>DICOM V3</TT> style' (using Sequences)
68 <LI> <TT>DICOMDIR</TT>
70 <LI> <TT>DICOMDIR</TT> full management (not limited to
71 <TT> PATIENT</TT>/<TT>STUDY</TT>/<TT>SERIE</TT>/<TT>IMAGE</TT>)
72 <LI> Allow user to add an entry (belonging to the file header Dicom
73 entries) to the default entry list, before
74 making a <TT>DICOMDIR</TT> from a root directory
75 <LI> Allow user to add an entry of his own (for instance an <TT>Icon</TT>
76 to each image, or to each Serie).
81 <LI> An accurate <TT>SerieHelper</TT> <br>
82 Right now <TT>SerieHelper</TT> only works on 'bona fide Series', and
83 breaks on wrongly forged Series.<br>
84 We are still looking for any heuristics...
85 <LI> A <TT>SerieHelper</TT> that would use the <TT>DICOMDIR</TT> (if any)
86 instead of parsing all the files within the Root Directory
90 <LI> 16-bits-LUT full Management
91 <LI> User friendly management of <TT>Rescale Slope</TT> and
92 <TT>Rescale Intercept</TT>.<br>
93 (Well... Maybe it's up to the application to deal with it, not to
95 <LI> Allow manual adjunction / automatic recognition (pfff!...)
96 of the private <TT>Dicom Dictionary</TT>
97 to be used to parse <TT>Shadow groups</TT> against.
98 <LI> User friendly way of anonymizing image when Patient's name is
99 burnt-in within the Pixels :-( <br>
100 --> In many cases, the burnt-in Patient's name, etc
101 are actually stored as 'overlays'.<br>
102 'Normal' reading doesn't load those type of overlays.
105 <!#######################################################################>
106 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
108 <A CLASS="anchor" NAME="NewsCurrentVersion">
109 <B>Current Version (CVS) : gdcm1.3.2 </B></A>
114 <LI> <A HREF="News.html#missing">Missing Features</a>
115 <LI>Differences between <b>gdcm 1.3.1</b> and <b>gdcm 1.3.2</b>
117 <LI> Uncorrect reading/writting of JPEG/JPE2000 images when
118 BitsAllocated=16/BitsStored=8
119 <LI> Uncorrect writing of JPEG/JPE2000 image with an 'Icon' Sequence
120 <LI> Uncorrect writting of JPE2000 multiframe images
121 <LI> Uncorrect writting of images with a DataElement belonging to group
122 0002, inside a Sequence
123 <LI> Uncorrect re-writting of Implicit Value Representation images with
124 'shadow groups' when Explicit Value Representation was asked
125 (unexpected swap to Implicit VR)
127 If you experience troubles with gdcm-written images, check which
128 gdcm version was used (PrintFile filein=yourFileName.dcm)
133 <a href="uml-gdcmV1.2.pdf">gdcm UML Class Diagram</a> current version.
134 <LI> <a href= "DocCVS/html.user/index.html">User Documentation</a>
135 <LI> <a href= "DocCVS/html.developper/index.html">Developper
140 <LI> To be able to use gdcm1.3.x and ITK, developer is now allowed to
141 choose his own namespace for gdcm at CMake time : see GDCM_NAME_SPACE
143 <LI> JPEG and JPEG2000 compression writting are now available.
144 see Examples/WriteDicomAsJPEG.cxx and Examples/WriteDicomAsJPEG2000.cxx
145 <LI> To <i>try to</i> make gdcm images PACS usable, user is now allowed to
146 gdcm what kind of image he wants to write, using : <br>
147 <TT>void FileHelper::SetContentType (ImageContentType c);</TT> <br>
148 Four different types are identifyed (probabely more will be added) :
151 1) user created ex nihilo his own image and wants to write it as a Dicom image.<br>
152 c : <TT>USER_OWN_IMAGE</TT>
154 2) user modified the pixels of an existing image, using mathematical operations.<br>
155 c : <TT>FILTERED_IMAGE</TT>
157 3) user created a new image, using existing images (eg MIP, MPR, cartography image)<br>
158 c : <TT>CREATED_IMAGE</TT>
160 4) user modified/added some tags *without processing* the pixels (anonymization, etc)<br>
161 c : <TT>UNMODIFIED_PIXELS_IMAGE</TT>
163 <LI> Stupid difference between <TT>gdcm::ValEntry</TT>
164 and <TT>gdcm::BinEntry</TT> removed. <br>
165 Only <TT>gdcm::DataEntry</TT> exist, now.
166 Should have been considered as a 'Bug Fix'.<br>
167 Actually, it's an API breaking modification ...
170 <TT>std::string const &DataEntry::GetString() const</TT><br>
171 returns as a string (when possible) the value of the DataEntry
173 <TT>void DataEntry::SetString(std::string const &value)</TT><br>
174 Sets the 'value' of a DataEntry, passed as a std::string
176 <TT>void DataEntry::SetBinArea( uint8_t *area, bool self ) </TT><br>
177 Sets the value (non string) of the current Dicom DataEntry
179 <TT>void DataEntry::CopyBinArea( uint8_t *area, uint32_t length )</TT><br>
180 Inserts the value (non string) into the current DataEntry
182 <TT>void DataEntry::SetValue(const uint32_t &id, const double
184 Inserts the elementary (non string) value into the current
185 (multivaluated) DataEntry, at the <TT>id></TT> position.
187 <TT>double DataEntry::GetValue(const uint32_t &id) const </TT><br>
188 returns, as a double one of the values (when entry is
189 multivaluated), identified by its index <TT>id</TT>.
192 <TT>DocEntrySet::GetEntryValue()</TT> replaced by
193 <TT>DocEntrySet::GetEntryString()</TT> <br>
194 <LI> SerieHelper : <br>
195 Add some methods, to split a 'SingleSerieUID' Fileset into
196 'Extra Coherent' FileSets. <br>
197 They return a std::map of 'Filesets' (actually : std::vector
199 The key is the 'Orientation', the 'Position'
200 or the value of a user choosen 'Tag' <br>
201 - <TT>XCoherentFileSetmap SplitOnOrientation(FileList *fileSet);
203 - <TT>XCoherentFileSetmap SplitOnPosition(FileList *fileSet);
205 - <TT>XCoherentFileSetmap SplitOnTagValue(FileList *fileSet,
206 uint16_t group, uint16_t element);
208 These methods must be called by user, depending on what he wants
209 to do, at application time.- *he* only knows what his Series
211 <LI> To avoid memory leaks and seg faults the user intended classes
212 use now a Reference Counter.<br>
214 <LI> <TT>new()</TT> and <TT>delete()</TT> are replaced by
215 <TT>New()</TT> and <TT>Delete()</TT>
216 <LI> <TT>Register()</TT> and <TT>Unregister()</TT> methods are
218 <LI> --> Well ... People from ITK don't seem to agree too much with
220 They demand to be allowed to allocate gdcm objects in the stack as
221 well, not only in the heap.
226 <LI> API breaking modifications (since previous version)
228 <LI> Stupid difference between <TT>gdcm::ValEntry</TT>
229 and <TT>gdcm::BinEntry</TT> removed. <br>
230 Only <TT>gdcm::DataEntry</TT> exist, now. <br>
232 ValEntry(DictEntry *e);
233 BinEntry(DictEntry *e);
234 -->DataEntry *New(uint16_t group,uint16_t elem, VRKey const &vr);
236 std::string const &ValEntry::GetValue() const;
237 std::string const &BinEntry::GetValue() const;
238 -->std::string const &DataEntry::GetString() const;
240 uint8_t *BinEntry::GetBinArea();
241 -->uint8_t *DataEntry::GetBinArea();
243 void ValEntry::SetValue(std::string const &value);
244 void BinEntry::SetValue(std::string const &value);
245 -->void DataEntry::SetString(std::string const &value);
247 void BinEntry::SetBinArea( uint8_t *area, bool self = true );
248 -->void DataEntry::SetBinArea( uint8_t *area, bool self = true );
250 void ValEntry::CopyValEntry(uint16_t gr, uint16_t el);
251 -->void DataEntry::CopyDataEntry(uint16_t gr, uint16_t el, VRKey const &vr);
258 DocEntry *p3 = item2->GetDocEntry(0x0018,0x0050);
259 if( !p3 ) return false;
260 ContentEntry *entry2 = dynamic_cast<ContentEntry *>(p3);
261 std::string thickness = entry2->GetValue();
264 DocEntry *p3 = item2->GetDocEntry(0x0018,0x0050);
265 if( !p3 ) return false;
266 DataEntry *entry2 = dynamic_cast<DataEntry *>(p3);
267 std::string thickness = entry2->GetString();
271 <LI> Avoid tons of CPU time consuming accesses to DICOM Dictionnary
273 DataEntry *FileHelper::CopyDataEntry(uint16_t group, uint16_t elem);
274 -->DataEntry *FileHelper::CopyDataEntry(uint16_t group, uint16_t elem,
275 const VRKey &vr = GDCM_VRUNKNOWN);
277 void FileHelper::CheckMandatoryEntry(uint16_t group, uint16_t elem, std::string value);
278 -->void FileHelper::CheckMandatoryEntry(uint16_t group, uint16_t elem, std::string value,
279 const VRKey &vr = GDCM_VRUNKNOWN);
281 void FileHelper::SetMandatoryEntry(uint16_t group, uint16_t elem, std::string value);
282 -->void FileHelper::SetMandatoryEntry(uint16_t group, uint16_t elem, std::string value,
283 const VRKey &vr = GDCM_VRUNKNOWN);
285 void FileHelper::CopyMandatoryEntry(uint16_t group, uint16_t elem, std::string value);
286 -->void FileHelper::CopyMandatoryEntry(uint16_t group, uint16_t elem, std::string value,
287 const VRKey &vr = GDCM_VRUNKNOWN);
291 For multivaluated numeric DataEntries
292 -->void DataEntry::SetValue(const uint32_t &id,const double &val);
293 -->double DataEntry::GetValue(const uint32_t &id) const;
294 -->uint32_t DataEntry::GetValueCount() const;
296 For converting 'Decimal String'
297 -->bool GetDSValue(std::vector <double> &valueVector);
300 <LI> Avoid too many source file modifications from gdcm1.2 to gdcm1.3
304 #define ValEntry DataEntry
305 #define BinEntry DataEntry
307 #define GetEntryValue(g,e) GetEntryString(g,e)
308 #define GetEntryForcedAsciiValue(g,e) GetEntryString(g,e)
310 #define GetValEntry(g,e) GetDataEntry(g,e)
311 #define GetBinEntry(g,e) GetDataEntry(g,e)
312 #define GetValue() GetString()
314 #define InsertValEntry(v,g,e,vr) InsertEntryString(v,g,e,vr) // warning mind the VR!
315 #define InsertBinEntry(b,l,g,e,vr) InsertEntryBinArea(b,l,g,e,vr)
317 #define SetValEntry(c,g,e) SetEntryString(c,g,e) | !!
318 #define SetValEntry(c,en) SetEntryString(c,en) | !!
320 #define SetBinEntry(c,l,en) SetEntryBinArea(c,l,en) | !!
321 #define SetBinEntry(c,l,g,e) SetEntryBinArea(c,l,g,e) | !!
323 #define NewValEntry(g,e,vr) NewDataEntry(g,e,vr)
324 #define NewBinEntry(g,e,vr) NewDataEntry(g,e,vr)
331 <LI> Implicit VR - Big Endian (G.E Private) Transfert Syntax 16 Bits
332 images are now read correctly.
333 <LI> File::GetZOrigin() returns accurate result in any case.
340 <LI> Use of <TT>Implicit Value Representation</TT> writting mode may
341 causes troubles, when there are some <TT>SQ</TT> belonging to a
342 <TT>Shadow Group</TT>. <br>
343 Better you use <TT>Explicit Value Representation</TT> writting mode ...
344 <LI> Troubles on 'Big endian' processors (i.e. Apple/Motorola, SunSparc
345 ...) when writting 16 Bits images.
346 <LI> Troubles on 64-bits processors.
356 <!#######################################################################>
357 <A CLASS="anchor" NAME="NewsPreviousVersions">
358 <!#######################################################################>
359 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
361 <A CLASS="anchor" NAME="NewsVersion1_2">
362 <B>Version 1.2 </B></A>
367 <a href="Doc1.0/uml-gdcmV1.0.pdf">gdcm 1.2 UML Class Diagram</a> version
369 <LI> This is the Class Diagram of the version used within ITK.
370 (Hope we unify CVS version and ITK version, some day!)
372 <!#######################################################################>
374 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
376 <A CLASS="anchor" NAME="NewsVersion1_1">
377 <B>Version 1.1 (September 14 2005)</B></A>
382 <a href="Doc1.0/uml-gdcmV1.0.pdf">gdcm 1.1 UML Class Diagram</a> version.
383 <LI> <a href= "Doc1.0/html.user/index.html">User Documentation</a>
384 <LI> <a href= "Doc1.0/html.developper/index.html">Developper
389 <TT>gdcm::Dict:AddDict(std::string fullPathPrivateDictionaryFileName)</TT>
391 <TT>gdcm::Dict::RemoveDict(std::string fullPathPrivateDictionaryFileName)</TT>
393 to allow user to choose the 'Private Dictionary' he wants to work with.
395 One can dream about a better API;<br>
396 This one allow right now anybody to see very easyly if the use
397 of a given private dicom dictionary is of any help or not.
400 <TT>PrintFile</TT> has now a new command line argument manager option :<br>
401 <TT>dict=fullPathNamePrivateDictionaryFile</TT><br>
402 to allow user to see with no extra coding what differences
403 makes the use or not of a private Dicom Dictionary.<br>
404 e.g. : use it as follow <br>
405 <TT>PrintFile filein=myGEdicomFile.dcm
406 dict=/user/userName/gdcm/Dicts/GEMS-Advance.dic</TT>
409 (Not a great one ...)
410 Stupid method names : <br><TT>DicomDir::WriteDicomDir()</TT>
411 and <TT>DicomDir::AnonymizeDicomDir()</TT> <br>replaced by : <br>
412 <TT>DicomDir::Write()</TT>
413 and <TT>DicomDir::Anonymize()</TT>
416 void Document::AddForceLoadElement(uint16_t group, uint16_t elem);
418 allows user to tell <TT>gdcm::Document</TT> Loader he wants
419 to force the loading of a given set of <TT>DocEntries</TT>,
420 even if their length exceeds the current
421 <TT>MAX_SIZE_LOAD_ELEMENT_VALUE</TT>.
424 Many users expect from <TT>vtkGdcmReader</TT> it 'orders' the images
425 (that's the job of <TT>gdcm::SerieHelper</TT> ...)<br>
426 When user <b>knows</b> the files with same Serie UID
427 have same sizes, same 'pixel' type, same color convention, ...
428 the right way to proceed is as follow :
430 gdcm::SerieHelper *sh= new gdcm::SerieHelper();
431 // if user wants *not* to load some parts of the file headers
432 sh->SetLoadMode(loadMode);
434 // if user wants *not* to load some files
435 sh->AddRestriction(group, element, value, operator);
436 sh->AddRestriction( ...
437 sh->SetDirectory(directoryWithImages);
439 // if user *knows* how to order his files
440 sh->SetUserLessThanFunction(userSuppliedComparisonFunction);
442 // if user wants to sort reverse order
443 sh->SetSortOrderToReverse();
445 // here, we suppose only the first 'Single SerieUID' Fileset is of interest
446 // Just iterate using sh->NextSingleSerieUIDFileSet()
447 // if you want to get all of them
448 gdcm::FileList *l = sh->GetFirstSingleSerieUIDFileSet();
450 // if user is doesn't trust too much the files with same Serie UID
451 if ( !sh->IsCoherent(l) )
452 return; // not same sizes, or not same 'pixel type' -> stop
454 sh->OrderFileList(l); // sort the list
456 vtkGdcmReader *reader = vtkGdcmReader::New();
457 // if user wants to modify pixel order (Mirror, TopDown, ...)
458 // he has to supply the function that does the job
459 // (a *very* simple example is given in vtkgdcmSerieViewer.cxx)
460 reader->SetUserFunction (userSuppliedFunction);
462 // to pass a 'Single SerieUID' Fileset as produced by gdcm::SerieHelper
463 reader->SetCoherentFileList(l);
466 You can see a full example in <TT>vtk/vtkgdcmSerieViewer.cxx</TT><br>
469 <TT>vtkgdcmSerieViewer dirname=Dentist mirror</TT><br>
470 <TT>vtkgdcmSerieViewer dirname=Dentist reverse</TT><br>
471 <TT>vtkgdcmSerieViewer dirname=Dentist reverse topdown</TT><br>
475 <LI> <TT>vtkGdcmReader::SetUserFunction (userSuppliedFunction)</TT><br>
477 <TT>void userSuppliedFunction(uint8_t *imageData, File *f);</TT><br>
478 allows user to reorganize the pixels of each image just after reading
479 it (to mirror, or topdown the image, for instance)<br>
480 Note : <TT>uint8_t *</TT> doesn't mean it works only on 8 Bits images.
481 <br> It's for prototyping. Feel free to cast it.
484 SerieHelper::SetUserLessThanFunction(userSuppliedComparisonFunction)
485 </TT><br> with : <br>
486 <TT>bool userSuppliedComparisonFunction(File *, File *);</TT><br>
487 allows user -when he knows more about his files than gdcm does-
488 to give his own comparison function.
489 <LI> <TT>SerieHelper::SetSortOrderToReverse</TT> allows user to ask
490 to sort the Files reverse order.
491 <LI> <TT>SerieHelper::AddRestriction</TT> has now a new constructor<br>
492 <TT>AddRestriction(group, element, value, operator);</TT><br>
493 allows user to exclude some files from the sorting, according to
494 any comparison operator <br>
495 (<TT>GDCM_EQUAL</TT>, <TT>GDCM_DIFFERENT</TT>,
496 <TT>GDCM_GREATER</TT>, <TT>GDCM_GREATEROREQUAL</TT>,
497 <TT>GDCM_LESS</TT>, <TT>GDCM_LESSOREQUAL</TT>), not only on the
500 <LI> <TT>AnonymizeNoLoad</TT> used with <TT>dirin=inputDirectoryName</TT>
501 anonymizes all the files within the given Directory.
503 User may also choose extra elements he wants to rub out: <br>
504 <TT>rubout=listOfElementsToRubOut</TT><br>
505 with <tt>listOfElementsToRubOut : group1-elem1,group2-elem2,
506 ...</TT> (in hexa, no space within the list )
508 <LI> <TT>gdcm::SerieHelper()</TT> has a new method
509 <TT>void AddGdcmFile(File *header)</TT>, that allows aware user to
510 create a '<TT>FileList</TT>' (actually a
511 <TT>std::vector< File* > </TT>).<br>
512 The <TT>FileList</TT> created this way will be the
513 'first one' in the <TT>gdcm::FileHelper()</TT> (retrieve it with
514 <TT>FileList *GetFirstCoherentFileList()</TT> ).<br>
515 It may be sorted using <TT>OrderFileList</TT>.<br>
516 No 'coherence check' will be performed on this <TT>FileList</TT>
518 It may be passed to a <TT>vtkGdcmReader</TT>
519 (to avoid parsing twice the files)
521 <LI> <TT>vtkGdcmReader</TT> can now get the result of
522 <TT>gdcm::SerieHelper</TT> (to avoid parsing twice the files)<br>
523 Proceed as follow :<br>
525 gdcmSerieHelper *sh = new gdcmSerieHelper();
526 sh->SetDirectory(myImageDirectory, true);
527 gdcmFileList *l = s->GetFirstCoherentFileList();
530 vtkGdcmReader *gr = new vtkGdcmReader();
531 gr->SetCoherentFileList(l);
534 This works with a directory that contains only one '<TT>Serie</TT>'
535 (same <TT>Serie UID</TT> for all the images).<br>
536 If it contains more than one <TT>Serie</TT>, you'll have to loop
537 on the Series, using <TT>GetNextCoherentFileList()</TT>;<br>
538 It will be up to the user to delete the <TT>gdcm::File</TT>.
540 See <TT>vtkgdcmSerieViewer</TT> for an example.
542 <LI> Both <TT>vtkgdcmViewer</TT> and <TT>vtkgdcmViewer2</TT>
543 are available to allow easy displaying of single/multiframe
544 GreyLevel/RGB/PaletteColor images<br><br>
545 <LI> <TT>DICOMDIR</TT> anonymiser (<TT>Load</TT> and <TT>Noload</TT> mode)
547 <LI> Because the <TT>gdcm::DicomDir::Load()</TT> method may be used
548 either for loading an already made <TT>DICOMDIR</TT> file or for
549 parsing all the dicom files with a given root directory we
550 syntaxically separated the operations: <br>
551 For loading an already made <TT>DICOMDIR</TT> file, use : <br>
553 gdcm::DicomDir *d = new gdcm::DicomDir();
554 d->SetFileName(fileName);
558 For parsing all the dicom files within a given root directory, use :<br>
560 gdcm::DicomDir *d = new gdcm::DicomDir();
561 d->SetDirectoryName(dirName);
565 <b>Don't</b> use any longer old deprecated style: <br>
567 gdcm::DicomDir *d = new gdcm::DicomDir();<br>
568 d->SetParseDir(true); // </TT>or <TT>d->SetParseDir(false);<br>
569 d->Load( fileName );<br>
572 <LI> User is now allowed to tell <TT>gdcm::Document</TT> constructor
573 he doesn't want to deal with <TT>SeqEntry</TT>
574 (every time it's possible, i.e for 'true length' Sequences) <br>
575 and/or he doesn't want to deal with <TT>Shadow groups</TT>
576 (every time it's possible i.e. when element <TT>0x0000</TT>
577 exists for this Group) <br>
578 or he doesn't want to deal with <TT>SeqEntry</TT> that belong to a
579 <TT>Shadow group</TT> (every time it's possible
580 -'true length' Sequence-)<br>
583 gdcm::File *f = new gdcm::File();
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
587 f->SetLoadMode(NO_SHADOWSEQ); | target file
588 f->SetFileName(fileName);
591 <b>Don't</b> use any longer old deprecated style: <br>
593 gdcm::File *f = new gdcm::File(fileName);</TT> <br>
595 <LI> User is now allowed to tell <TT>gdcm::DicomDir</TT> constructor
596 he doesn't want to deal with <TT>SeqEntry</TT>
597 (every time it's possible, i.e for 'true length' Sequences) <br>
598 and/or he doesn't want to deal with <TT>Shadow groups</TT>
599 (every time it's possible i.e. when element <TT>0x0000</TT>
600 exists for this Group) <br>
601 or he doesn't want to deal with <TT>SeqEntry</TT> that belong to a
602 <TT>Shadow group</TT> (every time it's possible
603 -'true length' Sequence-)<br>
604 when he parses all the Dicom files within a given directory.<br>
607 gdcm::DicomDir *f = new gdcm::DicomDir();
608 f->SetLoadMode(NO_SEQ); | depending on what
609 f->SetLoadMode(NO_SHADOW); | you want *not*
610 f->SetLoadMode(NO_SEQ | NO_SHADOW);| to load from the files
611 f->SetLoadMode(NO_SHADOWSEQ); | within the root directory
612 f->SetDirectoryName(rootDirectoryName);
615 <b>Don't</b> use any longer old deprecated style: <br>
617 gdcm::DicomDir *dcmdir = new gdcm::DicomDir(dirName, true);</TT><br>
623 <LI> No more trouble when the 'endianess' switches within Sequences.
624 <LI> No more trouble with 'no length Sequences' belonging to a
625 <TT>Shadow Group</TT> when they are 'Implicit VR'.
626 <LI> The difference between <TT>MONOCHROME1</TT> (low values = bright,
627 high values = dark) and <TT>MONOCHROME2</TT> (low values = dark,
628 high values = bright) is now taken into account.<br>
629 It's no longer up to the user to change the pixels value
630 <LI> Writing a 'True Dicom' image after reading an <TT>ACR-NEMA</TT> image
631 does not request any longer from the user to build up
632 'manually' the Meta Elements group (<TT>0x0002</TT>)
633 <LI> Old '24 Bits' <TT>ACR-NEMA</TT> are now correctly re-written
634 in <TT>DICOM V3</TT> mode.
635 <LI> Element <TT>0x0000</TT> of <TT>Shadow groups</TT> is always forced to be a
636 <TT>ValEntry</TT> and its <TT>VR</TT> is forced to <TT>UL</TT>
640 <LI> A.P.I. breaking modifications (since previous version : <TT>1.0</TT>)
642 <LI> NEVER more API breaking modifications !!!
655 <!#######################################################################>
656 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
658 <A CLASS="anchor" NAME="NewsVersion1_0">
659 <B>Version 1.0 (Feb 14 2005)</B></A>
665 <a href="Doc1.0/uml-gdcmV1.0.pdf">gdcm 1.0 UML Class Diagram</a> version.
666 <LI> <a href= "Doc1.0/html.user/index.html">User Documentation"</a>
667 <LI> <a href= "Doc1.0/html.developper/index.html">Developper
669 <LI> Final check of the jpeg sub-library: all 'classical' jpeg
670 compressed Dicom files can be read<br>
671 <LI>All the previously gdcm-breaker images are now readable<br>
672 <LI> A huge number of memory leaks removed
673 <LI> Improvement of write process
677 <LI> A.P.I. breaking modifications (since previous version : <TT>0.6</TT>)
679 <LI> Use of <TT> namespace</TT> : all the methods formerly named
680 <TT>className::gdcmXxx()</TT> are now named <TT>className::Xxx()</TT>
681 <br> End user will have to call them as <TT>gdcm::className::Xxx() </TT>
682 <LI> a <TT>gdcm::Document</TT> is now specialized in :
684 <LI> <TT>gdcm::DicomDir</TT>
685 <LI> <TT>gdcm::File</TT>
687 <LI> a <TT>gdcm::DicomElementSet</TT> is composed of a set of
688 <TT>gdcm::DicomDocEntry</TT>
689 <LI> a <TT>gdcm::DicomDocEntry</TT> can be :
691 <LI> a <TT>gdcm::ContentEntry</TT>, specialized in :
693 <LI> <TT>gdcm::ValEntry</TT>
694 <LI> <TT>gdcm::BinEntry</TT> (no longer a specialization of
695 <TT>gdcm::ValEntry</TT>)
697 <LI> a <TT>gdcm::SeqEntry</TT>
699 <LI> Removal of useless accessors <TT>GetXxxByname</TT>, <TT>SetXxxByname</TT>
700 <LI> Renaming of accessors <TT>GetXxxByNumber</TT>, <TT>SetXxxByNumber</TT>
703 <LI> <TT>GetEntryByNumber
704
705 --> GetEntryValue</TT>
706 <LI> <TT>GetEntryLengthByNumber --> GetEntryLength</TT>
707 <LI> <TT>GetEntryOffsetByNumber --> GetEntryOffset</TT>
708 <LI> <TT>GetEntryVRByNumber
709 --> GetEntryVR</TT>
711 <LI> <TT>GetDocEntryByNumber
712 --> GetDocEntry</TT>
713 <LI> <TT>GetValEntryByNumber
714 --> GetValEntry</TT>
715 <LI> <TT>GetBinEntryByNumber
716 --> GetBinEntry</TT>
717 <LI> <TT>GetSeqEntryByNumber
718 --> GetSeqEntry</TT>
723 <!#######################################################################>
724 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
726 <A CLASS="anchor" NAME="NewsVersion0_6">
727 <B>Version 0.6 (June 8 2004)</B></A>
730 This version will be used by Insight Tool Kit
731 (<a href="http://www.itk.org">ITK</a> 2.0) at the beginning of 2005.<br>
732 It's not yet packaged ...<br><br>
733 <LI> <a href= "Doc0.6/html.user/index.html">User Documentation"</a>
734 <LI> <a href= "Doc0.6/html.developper/index.html">Developper Documentation"</a>
735 <LI> The new <TT>gdcmDocument</TT> class is a parent class of
736 <TT>gdcmHeader</TT> class and <TT>gdcmDicomDir</TT> class.
737 <LI> Massive modifications in the Class Diagram :
739 <LI> any dicom related file is a <TT>gdcmDocument</TT>
740 <LI> a <TT>gdcmDocument</TT> can be :
742 <LI> a <TT>gdcmHeader</TT>, if it contains pixel data
743 <LI> a <TT>gdcmDicomDir</TT>, if it contains only informations
744 on the files in a given directory
747 <LI> a <TT>gdcmDocument</TT> is_a <TT>gdcmElementSet</TT>,
748 composed of a set of <TT>gdcmEntry</TT> separated into :
750 <LI> <TT>gdcmValEntry</TT><br>
751 a specialization of <TT>gdcmValEntry</TT>, for 'non
752 <TT>std::string</TT> representable' values is
753 <TT>gdcmBinEntry</TT>
754 <LI> <TT>gdcmSeqEntry</TT> (VR = <TT>SQ</TT>, i.e Dicom Sequences)<br>
755 they are dealt as tree-like structures :<br>
756 - a <TT>gdcmSeqEntry</TT> is considered as a set
757 of <TT>gdcmSQItem</TT>,<br>
758 - a <TT>gdcmSQItem</TT> is_a <TT>gdcmElementSet</TT>, composed
759 of <TT>gdcmDocEntries</TT>, recursively <br>
762 <LI> Improvement of the jpeg sub-library: jpeg
763 compressed Dicom files (lossless and lossy)
764 might be read (check-it out)
767 <!#######################################################################>
768 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
770 <A CLASS="anchor" NAME="NewsVersion0_4">
771 <B>Version 0.4 (February 6 2004)</B></A>
775 <LI> <a href="Doc0.4/uml-gdcmV0.4.pdf">gdcm 0.4 UML Class Diagram</a>.
776 <LI> <a href= "Doc0.4/html.user/index.html">User Documentation"</a>
777 <LI> <a href= "Doc0.4/html.developper/index.html">Developper Documentation </a>
779 <LI> Introduction of a jpeg sub-library: some very simple jpeg-lossy
780 compressed Dicom files might be working (check-it out).
781 <LI> And also, fewer memory leaks, cleaned-up stl usage (should work
782 with gcc-3.x), python disutil installer (see file setup.py)
783 supporting both Swig and vtk wrapping.
784 <LI> Introduction of a RLE (Run-Time Encoding) library
785 <LI> Color images (RGB or Palette Color) are dealt with
786 <LI> Confusing names <TT>gdcmPatient</TT>, <TT>gdcmStudy</TT>,
787 <TT>gdcmSerie</TT>, <TT>gdcmPatient</TT> changed to
788 <TT>gdcmDicomDirPatient</TT>, <TT>gdcmDicomDirStudy</TT>,
789 <TT>gdcmDicomDirSerie</TT>, <TT>gdcmDicomDirPatient</TT>
793 <!#######################################################################>
794 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
796 <A CLASS="anchor" NAME="NewsVersion0_3">
797 <B>Version 0.3 (July 8 2003)</B></A>
800 <LI> <TT>gdcmFile</TT> class now enables acces to the data
801 i.e. the image[s] content. Previously only parsing of the
802 Dicom header was available through usage of <TT>gdcmHeader</TT>
804 <LI> a <A HREF="http://public.kitware.com/VTK/">VTK</A> plugin
805 of gdcm is now available through the <TT>vtkGdcmReader</TT>
806 vtk class (see it as a vtk wrapper of gdcm), which enables
808 <LI> Loading of a single image,
809 <LI> Loading of a stack of images from multiple Dicom files,
810 <LI> this class is wrapped for vtkPython (by using native vtk
813 <LI> Introduction of a jpeg sub-library: lossless-jpeg
814 compressed Dicom files work.
815 <LI> <TT>vtkgdcmViewer</TT> allows easy displaying of single/multiframe
816 GreyLevel/RGB/PaletteColor images
819 <!#######################################################################>
820 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
822 <A CLASS="anchor" NAME="NewsVersion0_1">
823 <B>Version 0.1 (April 1 2003)</B></A>
825 <!#######################################################################>
826 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
828 <A CLASS="anchor" name="NewsVersion0_1">
829 <B>Version 0.0 (March 14 2003)</B></A>
831 <HR size="1"><ADDRESS style="align: right;"></ADRESS>