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 <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 doesn't want to write down
55 <TT>SeqEntry</TT> (if any)
56 <LI> Allow user to tell the Writer he doesn't want to write down
57 <TT>Shadow groups</TT> (if any)
58 <LI> Allow user to tell the Writer he wants to split a
59 <TT>Multiframe</TT> image into a serie of
60 <TT>Single frame</TT> images.
61 <LI> Allow user to tell the Writer he wants to agregate a
62 Serie of <TT>Single frame</TT> images into a
63 <TT>Multiframe</TT> image.
67 <LI> Full <TT>Icon Image</TT> management (Read and Write)
68 <LI> Full <TT>Overlays</TT> management (Read and Write) <br>
69 both for '<TT>ACR-NEMA</TT> style' (using groups <TT>0x6000</TT>
70 and next) and '<TT>DICOM V3</TT> style' (using Sequences)
72 <LI> <TT>DICOMDIR</TT>
74 <LI> <TT>DICOMDIR</TT> full management (not limited to
75 <TT> PATIENT</TT>/<TT>STUDY</TT>/<TT>SERIE</TT>/<TT>IMAGE</TT>)
76 <LI> Allow user to add an entry (belonging to the file header Dicom
77 entries)to the default entry list, before
78 making a <TT>DICOMDIR</TT> from a root directory
79 <LI> Allow user to add an entry of his owns (for instance an <TT>Icon</TT>
80 to each image, or to each Serie).
85 <LI> An accurate <TT>SerieHelper</TT> <br>
86 Right now <TT>SerieHelper</TT> only works on 'bona fide Series', and
87 breaks on wrongly forged Series.<br>
88 We are still looking for any heuristics...
89 <LI> A <TT>SerieHelper</TT> that would use the <TT>DICOMDIR</TT> (if any)
90 instead of parsing all the files within the Root Directory
94 <LI> 16-bits-LUT full Management
95 <LI> User friendly management of <TT>Rescale Slope</TT> and
96 <TT>Rescale Intercept</TT>.<br>
97 (Well... Maybe it's up to the application to deal with it, not to
99 <LI> Allow manual adjunction / automatic recognition (pfff!...)
100 of the private <TT>Dicom Dictionary</TT>
101 to be used to parse <TT>Shadow groups</TT> against.
102 <LI> User friendly way of anonymizing image when Patient's name is
103 burnt-in within the Pixels :-(
106 <!#######################################################################>
107 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
109 <A CLASS="anchor" NAME="NewsCurrentVersion">
110 <B>Current Version (CVS)</B></A>
115 <LI> <A HREF="News.html#missing">Missing Features</a>
119 <a href="uml-gdcmV1.2.pdf">gdcm UML Class Diagram</a> current version.
120 <LI> <a href= "DocCVS/html.user/index.html">User Documentation</a>
121 <LI> <a href= "DocCVS/html.developper/index.html">Developper
126 <LI> To be able to use gdcm1.3.x and ITK, developer is now allowed to
127 choose his own namespace for gdcm at CMake time : see GDCM_NAME_SPACE
129 <LI> JPEG and JPEG2000 compression writting are now available.
130 see Examples/WriteDicomAsJPEG.cxx and Examples/WriteDicomAsJPEG2000.cxx
131 <LI> To <i>try to</i> make gdcm images PACS usable, user is now allowed to
132 gdcm what kind of image he wants to write, using : <br>
133 <TT>void FileHelper::SetContentType (ImageContentType c);</TT> <br>
134 Four different types are identify (probabely more will be added) :
137 1) user created ex nihilo his own image and wants to write it as a Dicom image.<br>
138 c : <TT>USER_OWN_IMAGE</TT>
140 2) user modified the pixels of an existing image, using mathematical operations.<br>
141 c : <TT>FILTERED_IMAGE</TT>
143 3) user created a new image, using existing images (eg MIP, MPR, cartography image)<br>
144 c : <TT>CREATED_IMAGE</TT>
146 4) user modified/added some tags *without processing* the pixels (anonymization, etc)<br>
147 c : <TT>UNMODIFIED_PIXELS_IMAGE</TT>
149 <LI> Stupid difference between <TT>gdcm::ValEntry</TT>
150 and <TT>gdcm::BinEntry</TT> removed. <br>
151 Only <TT>gdcm::DataEntry</TT> exist, now.
152 Should have been considered as a 'Bug Fix'.<br>
153 Actually, it's an API breaking modification ...
156 <TT>std::string const &DataEntry::GetString() const</TT><br>
157 returns as a string (when possible) the value of the DataEntry
159 <TT>void DataEntry::SetString(std::string const &value)</TT><br>
160 Sets the 'value' of a DataEntry, passed as a std::string
162 <TT>void DataEntry::SetBinArea( uint8_t *area, bool self ) </TT><br>
163 Sets the value (non string) of the current Dicom DataEntry
165 <TT>void DataEntry::CopyBinArea( uint8_t *area, uint32_t length )</TT><br>
166 Inserts the value (non string) into the current DataEntry
168 <TT>void DataEntry::SetValue(const uint32_t &id, const double
170 Inserts the elementary (non string) value into the current
171 (multivaluated) DataEntry, at the <TT>id></TT> position.
173 <TT>double DataEntry::GetValue(const uint32_t &id) const </TT><br>
174 returns, as a double one of the values (when entry is
175 multivaluated), identified by its index <TT>id</TT>.
178 <TT>DocEntrySet::GetEntryValue()</TT> replaced by
179 <TT>DocEntrySet::GetEntryString()</TT> <br>
180 <LI> SerieHelper : <br>
181 Add some methods, to split a 'SingleSerieUID' Fileset into
182 'Extra Coherent' FileSets. <br>
183 They return a std::map of 'Filesets' (actually : std::vector
185 The key is the 'Orientation', the 'Position'
186 or the value of a user choosen 'Tag' <br>
187 - <TT>XCoherentFileSetmap SplitOnOrientation(FileList *fileSet);
189 - <TT>XCoherentFileSetmap SplitOnPosition(FileList *fileSet);
191 - <TT>XCoherentFileSetmap SplitOnTagValue(FileList *fileSet,
192 uint16_t group, uint16_t element);
194 These methods must be called by user, depending on what he wants
195 to do, at application time.- *he* only knows what his Series
197 <LI> To avoid memory leaks and seg faults the user intended classes
198 use now a Reference Counter.<br>
200 <LI> <TT>new()</TT> and <TT>delete()</TT> are replaced by
201 <TT>New()</TT> and <TT>Delete()</TT>
202 <LI> <TT>Register()</TT> and <TT>Unregister()</TT> methods are
204 <LI> --> Well ... People from ITK don't seem to agree too much with
206 They demand to be allowed to allocate gdcm objects in the stack as
207 well, not only in the heap.
212 <LI> API breaking modifications (since previous version)
214 <LI> Stupid difference between <TT>gdcm::ValEntry</TT>
215 and <TT>gdcm::BinEntry</TT> removed. <br>
216 Only <TT>gdcm::DataEntry</TT> exist, now. <br>
218 ValEntry(DictEntry *e);
219 BinEntry(DictEntry *e);
220 -->DataEntry *New(uint16_t group,uint16_t elem, VRKey const &vr);
222 std::string const &ValEntry::GetValue() const;
223 std::string const &BinEntry::GetValue() const;
224 -->std::string const &DataEntry::GetString() const;
226 uint8_t *BinEntry::GetBinArea();
227 -->uint8_t *DataEntry::GetBinArea();
229 void ValEntry::SetValue(std::string const &value);
230 void BinEntry::SetValue(std::string const &value);
231 -->void DataEntry::SetString(std::string const &value);
233 void BinEntry::SetBinArea( uint8_t *area, bool self = true );
234 -->void DataEntry::SetBinArea( uint8_t *area, bool self = true );
236 void ValEntry::CopyValEntry(uint16_t gr, uint16_t el);
237 -->void DataEntry::CopyDataEntry(uint16_t gr, uint16_t el, VRKey const &vr);
244 DocEntry *p3 = item2->GetDocEntry(0x0018,0x0050);
245 if( !p3 ) return false;
246 ContentEntry *entry2 = dynamic_cast<ContentEntry *>(p3);
247 std::string thickness = entry2->GetValue();
250 DocEntry *p3 = item2->GetDocEntry(0x0018,0x0050);
251 if( !p3 ) return false;
252 DataEntry *entry2 = dynamic_cast<DataEntry *>(p3);
253 std::string thickness = entry2->GetString();
257 <LI> Avoid tons of CPU time consuming accesses to DICOM Dictionnary
259 DataEntry *FileHelper::CopyDataEntry(uint16_t group, uint16_t elem);
260 -->DataEntry *FileHelper::CopyDataEntry(uint16_t group, uint16_t elem,
261 const VRKey &vr = GDCM_VRUNKNOWN);
263 void FileHelper::CheckMandatoryEntry(uint16_t group, uint16_t elem, std::string value);
264 -->void FileHelper::CheckMandatoryEntry(uint16_t group, uint16_t elem, std::string value,
265 const VRKey &vr = GDCM_VRUNKNOWN);
267 void FileHelper::SetMandatoryEntry(uint16_t group, uint16_t elem, std::string value);
268 -->void FileHelper::SetMandatoryEntry(uint16_t group, uint16_t elem, std::string value,
269 const VRKey &vr = GDCM_VRUNKNOWN);
271 void FileHelper::CopyMandatoryEntry(uint16_t group, uint16_t elem, std::string value);
272 -->void FileHelper::CopyMandatoryEntry(uint16_t group, uint16_t elem, std::string value,
273 const VRKey &vr = GDCM_VRUNKNOWN);
277 For multivaluated numeric DataEntries
278 -->void DataEntry::SetValue(const uint32_t &id,const double &val);
279 -->double DataEntry::GetValue(const uint32_t &id) const;
280 -->uint32_t DataEntry::GetValueCount() const;
282 For converting 'Decimal String'
283 -->bool GetDSValue(std::vector <double> &valueVector);
286 <LI> Avoid too many source file modifications from gdcm1.2 to gdcm1.3
290 #define ValEntry DataEntry
291 #define BinEntry DataEntry
293 #define GetEntryValue(g,e) GetEntryString(g,e)
294 #define GetEntryForcedAsciiValue(g,e) GetEntryString(g,e)
296 #define GetValEntry(g,e) GetDataEntry(g,e)
297 #define GetBinEntry(g,e) GetDataEntry(g,e)
298 #define GetValue() GetString()
300 #define InsertValEntry(v,g,e,vr) InsertEntryString(v,g,e,vr) // warning mind the VR!
301 #define InsertBinEntry(b,l,g,e,vr) InsertEntryBinArea(b,l,g,e,vr)
303 #define SetValEntry(c,g,e) SetEntryString(c,g,e) | !!
304 #define SetValEntry(c,en) SetEntryString(c,en) | !!
306 #define SetBinEntry(c,l,en) SetEntryBinArea(c,l,en) | !!
307 #define SetBinEntry(c,l,g,e) SetEntryBinArea(c,l,g,e) | !!
309 #define NewValEntry(g,e,vr) NewDataEntry(g,e,vr)
310 #define NewBinEntry(g,e,vr) NewDataEntry(g,e,vr)
317 <LI> Implicit VR - Big Endian (G.E Private) Transfert Syntax 16 Bits
318 images are now read correctly.
319 <LI> File::GetZOrigin() returns accurate result in any case.
326 <LI> Use of <TT>Implicit Value Representation</TT> writting mode may
327 causes troubles, when there are some <TT>SQ</TT> belonging to a
328 <TT>Shadow Group</TT>. <br>
329 Better you use <TT>Explicit Value Representation</TT> writting mode ...
330 <LI> Troubles on 'Big endian' processors (i.e. Apple/Motorola, SunSparc
331 ...) when writting 16 Bits images.
332 <LI> Troubles on 64-bits processors.
342 <!#######################################################################>
343 <A CLASS="anchor" NAME="NewsPreviousVersions">
344 <!#######################################################################>
346 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
348 <A CLASS="anchor" NAME="NewsVersion1_1">
349 <B>Version 1.1 (September 14 2005)</B></A>
354 <a href="Doc1.0/uml-gdcmV1.0.pdf">gdcm 1.1 UML Class Diagram</a> version.
355 <LI> <a href= "Doc1.0/html.user/index.html">User Documentation</a>
356 <LI> <a href= "Doc1.0/html.developper/index.html">Developper
361 <TT>gdcm::Dict:AddDict(std::string fullPathPrivateDictionaryFileName)</TT>
363 <TT>gdcm::Dict::RemoveDict(std::string fullPathPrivateDictionaryFileName)</TT>
365 to allow user to choose the 'Private Dictionary' he wants to work with.
367 One can dream about a better API;<br>
368 This one allow right now anybody to see very easyly if the use
369 of a given private dicom dictionary is of any help or not.
372 <TT>PrintFile</TT> has now a new command line argument manager option :<br>
373 <TT>dict=fullPathNamePrivateDictionaryFile</TT><br>
374 to allow user to see with no extra coding what differences
375 makes the use or not of a private Dicom Dictionary.<br>
376 e.g. : use it as follow <br>
377 <TT>PrintFile filein=myGEdicomFile.dcm
378 dict=/user/userName/gdcm/Dicts/GEMS-Advance.dic</TT>
381 (Not a great one ...)
382 Stupid method names : <br><TT>DicomDir::WriteDicomDir()</TT>
383 and <TT>DicomDir::AnonymizeDicomDir()</TT> <br>replaced by : <br>
384 <TT>DicomDir::Write()</TT>
385 and <TT>DicomDir::Anonymize()</TT>
388 void Document::AddForceLoadElement(uint16_t group, uint16_t elem);
390 allows user to tell <TT>gdcm::Document</TT> Loader he wants
391 to force the loading of a given set of <TT>DocEntries</TT>,
392 even if their length exceeds the current
393 <TT>MAX_SIZE_LOAD_ELEMENT_VALUE</TT>.
396 Many users expect from <TT>vtkGdcmReader</TT> it 'orders' the images
397 (that's the job of <TT>gdcm::SerieHelper</TT> ...)<br>
398 When user <b>knows</b> the files with same Serie UID
399 have same sizes, same 'pixel' type, same color convention, ...
400 the right way to proceed is as follow :
402 gdcm::SerieHelper *sh= new gdcm::SerieHelper();
403 // if user wants *not* to load some parts of the file headers
404 sh->SetLoadMode(loadMode);
406 // if user wants *not* to load some files
407 sh->AddRestriction(group, element, value, operator);
408 sh->AddRestriction( ...
409 sh->SetDirectory(directoryWithImages);
411 // if user *knows* how to order his files
412 sh->SetUserLessThanFunction(userSuppliedComparisonFunction);
414 // if user wants to sort reverse order
415 sh->SetSortOrderToReverse();
417 // here, we suppose only the first 'Single SerieUID' Fileset is of interest
418 // Just iterate using sh->NextSingleSerieUIDFileSet()
419 // if you want to get all of them
420 gdcm::FileList *l = sh->GetFirstSingleSerieUIDFileSet();
422 // if user is doesn't trust too much the files with same Serie UID
423 if ( !sh->IsCoherent(l) )
424 return; // not same sizes, or not same 'pixel type' -> stop
426 sh->OrderFileList(l); // sort the list
428 vtkGdcmReader *reader = vtkGdcmReader::New();
429 // if user wants to modify pixel order (Mirror, TopDown, ...)
430 // he has to supply the function that does the job
431 // (a *very* simple example is given in vtkgdcmSerieViewer.cxx)
432 reader->SetUserFunction (userSuppliedFunction);
434 // to pass a 'Single SerieUID' Fileset as produced by gdcm::SerieHelper
435 reader->SetCoherentFileList(l);
438 You can see a full example in <TT>vtk/vtkgdcmSerieViewer.cxx</TT><br>
441 <TT>vtkgdcmSerieViewer dirname=Dentist mirror</TT><br>
442 <TT>vtkgdcmSerieViewer dirname=Dentist reverse</TT><br>
443 <TT>vtkgdcmSerieViewer dirname=Dentist reverse topdown</TT><br>
447 <LI> <TT>vtkGdcmReader::SetUserFunction (userSuppliedFunction)</TT><br>
449 <TT>void userSuppliedFunction(uint8_t *imageData, File *f);</TT><br>
450 allows user to reorganize the pixels of each image just after reading
451 it (to mirror, or topdown the image, for instance)<br>
452 Note : <TT>uint8_t *</TT> doesn't mean it works only on 8 Bits images.
453 <br> It's for prototyping. Feel free to cast it.
456 SerieHelper::SetUserLessThanFunction(userSuppliedComparisonFunction)
457 </TT><br> with : <br>
458 <TT>bool userSuppliedComparisonFunction(File *, File *);</TT><br>
459 allows user -when he knows more about his files than gdcm does-
460 to give his own comparison function.
461 <LI> <TT>SerieHelper::SetSortOrderToReverse</TT> allows user to ask
462 to sort the Files reverse order.
463 <LI> <TT>SerieHelper::AddRestriction</TT> has now a new constructor<br>
464 <TT>AddRestriction(group, element, value, operator);</TT><br>
465 allows user to exclude some files from the sorting, according to
466 any comparison operator <br>
467 (<TT>GDCM_EQUAL</TT>, <TT>GDCM_DIFFERENT</TT>,
468 <TT>GDCM_GREATER</TT>, <TT>GDCM_GREATEROREQUAL</TT>,
469 <TT>GDCM_LESS</TT>, <TT>GDCM_LESSOREQUAL</TT>), not only on the
472 <LI> <TT>AnonymizeNoLoad</TT> used with <TT>dirin=inputDirectoryName</TT>
473 anonymizes all the files within the given Directory.
475 User may also choose extra elements he wants to rub out: <br>
476 <TT>rubout=listOfElementsToRubOut</TT><br>
477 with <tt>listOfElementsToRubOut : group1-elem1,group2-elem2,
478 ...</TT> (in hexa, no space within the list )
480 <LI> <TT>gdcm::SerieHelper()</TT> has a new method
481 <TT>void AddGdcmFile(File *header)</TT>, that allows aware user to
482 create a '<TT>FileList</TT>' (actually a
483 <TT>std::vector< File* > </TT>).<br>
484 The <TT>FileList</TT> created this way will be the
485 'first one' in the <TT>gdcm::FileHelper()</TT> (retrieve it with
486 <TT>FileList *GetFirstCoherentFileList()</TT> ).<br>
487 It may be sorted using <TT>OrderFileList</TT>.<br>
488 No 'coherence check' will be performed on this <TT>FileList</TT>
490 It may be passed to a <TT>vtkGdcmReader</TT>
491 (to avoid parsing twice the files)
493 <LI> <TT>vtkGdcmReader</TT> can now get the result of
494 <TT>gdcm::SerieHelper</TT> (to avoid parsing twice the files)<br>
495 Proceed as follow :<br>
497 gdcmSerieHelper *sh = new gdcmSerieHelper();
498 sh->SetDirectory(myImageDirectory, true);
499 gdcmFileList *l = s->GetFirstCoherentFileList();
502 vtkGdcmReader *gr = new vtkGdcmReader();
503 gr->SetCoherentFileList(l);
506 This works with a directory that contains only one '<TT>Serie</TT>'
507 (same <TT>Serie UID</TT> for all the images).<br>
508 If it contains more than one <TT>Serie</TT>, you'll have to loop
509 on the Series, using <TT>GetNextCoherentFileList()</TT>;<br>
510 It will be up to the user to delete the <TT>gdcm::File</TT>.
512 See <TT>vtkgdcmSerieViewer</TT> for an example.
514 <LI> Both <TT>vtkgdcmViewer</TT> and <TT>vtkgdcmViewer2</TT>
515 are available to allow easy displaying of single/multiframe
516 GreyLevel/RGB/PaletteColor images<br><br>
517 <LI> <TT>DICOMDIR</TT> anonymiser (<TT>Load</TT> and <TT>Noload</TT> mode)
519 <LI> Because the <TT>gdcm::DicomDir::Load()</TT> method may be used
520 either for loading an already made <TT>DICOMDIR</TT> file or for
521 parsing all the dicom files with a given root directory we
522 syntaxically separated the operations: <br>
523 For loading an already made <TT>DICOMDIR</TT> file, use : <br>
525 gdcm::DicomDir *d = new gdcm::DicomDir();
526 d->SetFileName(fileName);
530 For parsing all the dicom files within a given root directory, use :<br>
532 gdcm::DicomDir *d = new gdcm::DicomDir();
533 d->SetDirectoryName(dirName);
537 <b>Don't</b> use any longer old deprecated style: <br>
539 gdcm::DicomDir *d = new gdcm::DicomDir();<br>
540 d->SetParseDir(true); // </TT>or <TT>d->SetParseDir(false);<br>
541 d->Load( fileName );<br>
544 <LI> User is now allowed to tell <TT>gdcm::Document</TT> constructor
545 he doesn't want to deal with <TT>SeqEntry</TT>
546 (every time it's possible, i.e for 'true length' Sequences) <br>
547 and/or he doesn't want to deal with <TT>Shadow groups</TT>
548 (every time it's possible i.e. when element <TT>0x0000</TT>
549 exists for this Group) <br>
550 or he doesn't want to deal with <TT>SeqEntry</TT> that belong to a
551 <TT>Shadow group</TT> (every time it's possible
552 -'true length' Sequence-)<br>
555 gdcm::File *f = new gdcm::File();
556 f->SetLoadMode(NO_SEQ); | depending on what
557 f->SetLoadMode(NO_SHADOW); | you want *not*
558 f->SetLoadMode(NO_SEQ | NO_SHADOW);| to load from the
559 f->SetLoadMode(NO_SHADOWSEQ); | target file
560 f->SetFileName(fileName);
563 <b>Don't</b> use any longer old deprecated style: <br>
565 gdcm::File *f = new gdcm::File(fileName);</TT> <br>
567 <LI> User is now allowed to tell <TT>gdcm::DicomDir</TT> constructor
568 he doesn't want to deal with <TT>SeqEntry</TT>
569 (every time it's possible, i.e for 'true length' Sequences) <br>
570 and/or he doesn't want to deal with <TT>Shadow groups</TT>
571 (every time it's possible i.e. when element <TT>0x0000</TT>
572 exists for this Group) <br>
573 or he doesn't want to deal with <TT>SeqEntry</TT> that belong to a
574 <TT>Shadow group</TT> (every time it's possible
575 -'true length' Sequence-)<br>
576 when he parses all the Dicom files within a given directory.<br>
579 gdcm::DicomDir *f = new gdcm::DicomDir();
580 f->SetLoadMode(NO_SEQ); | depending on what
581 f->SetLoadMode(NO_SHADOW); | you want *not*
582 f->SetLoadMode(NO_SEQ | NO_SHADOW);| to load from the files
583 f->SetLoadMode(NO_SHADOWSEQ); | within the root directory
584 f->SetDirectoryName(rootDirectoryName);
587 <b>Don't</b> use any longer old deprecated style: <br>
589 gdcm::DicomDir *dcmdir = new gdcm::DicomDir(dirName, true);</TT><br>
595 <LI> No more trouble when the 'endianess' switches within Sequences.
596 <LI> No more trouble with 'no length Sequences' belonging to a
597 <TT>Shadow Group</TT> when they are 'Implicit VR'.
598 <LI> The difference between <TT>MONOCHROME1</TT> (low values = bright,
599 high values = dark) and <TT>MONOCHROME2</TT> (low values = dark,
600 high values = bright) is now taken into account.<br>
601 It's no longer up to the user to change the pixels value
602 <LI> Writing a 'True Dicom' image after reading an <TT>ACR-NEMA</TT> image
603 does not request any longer from the user to build up
604 'manually' the Meta Elements group (<TT>0x0002</TT>)
605 <LI> Old '24 Bits' <TT>ACR-NEMA</TT> are now correctly re-written
606 in <TT>DICOM V3</TT> mode.
607 <LI> Element <TT>0x0000</TT> of <TT>Shadow groups</TT> is always forced to be a
608 <TT>ValEntry</TT> and its <TT>VR</TT> is forced to <TT>UL</TT>
612 <LI> A.P.I. breaking modifications (since previous version : <TT>1.0</TT>)
614 <LI> NEVER more API breaking modifications !!!
627 <!#######################################################################>
628 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
630 <A CLASS="anchor" NAME="NewsVersion1_0">
631 <B>Version 1.0 (Feb 14 2005)</B></A>
637 <a href="Doc1.0/uml-gdcmV1.0.pdf">gdcm 1.0 UML Class Diagram</a> version.
638 <LI> <a href= "Doc1.0/html.user/index.html">User Documentation"</a>
639 <LI> <a href= "Doc1.0/html.developper/index.html">Developper
641 <LI> Final check of the jpeg sub-library: all 'classical' jpeg
642 compressed Dicom files can be read<br>
643 <LI>All the previously gdcm-breaker images are now readable<br>
644 <LI> A huge number of memory leaks removed
645 <LI> Improvement of write process
649 <LI> A.P.I. breaking modifications (since previous version : <TT>0.6</TT>)
651 <LI> Use of <TT> namespace</TT> : all the methods formerly named
652 <TT>className::gdcmXxx()</TT> are now named <TT>className::Xxx()</TT>
653 <br> End user will have to call them as <TT>gdcm::className::Xxx() </TT>
654 <LI> a <TT>gdcm::Document</TT> is now specialized in :
656 <LI> <TT>gdcm::DicomDir</TT>
657 <LI> <TT>gdcm::File</TT>
659 <LI> a <TT>gdcm::DicomElementSet</TT> is composed of a set of
660 <TT>gdcm::DicomDocEntry</TT>
661 <LI> a <TT>gdcm::DicomDocEntry</TT> can be :
663 <LI> a <TT>gdcm::ContentEntry</TT>, specialized in :
665 <LI> <TT>gdcm::ValEntry</TT>
666 <LI> <TT>gdcm::BinEntry</TT> (no longer a specialization of
667 <TT>gdcm::ValEntry</TT>)
669 <LI> a <TT>gdcm::SeqEntry</TT>
671 <LI> Removal of useless accessors <TT>GetXxxByname</TT>, <TT>SetXxxByname</TT>
672 <LI> Renaming of accessors <TT>GetXxxByNumber</TT>, <TT>SetXxxByNumber</TT>
675 <LI> <TT>GetEntryByNumber
676
677 --> GetEntryValue</TT>
678 <LI> <TT>GetEntryLengthByNumber --> GetEntryLength</TT>
679 <LI> <TT>GetEntryOffsetByNumber --> GetEntryOffset</TT>
680 <LI> <TT>GetEntryVRByNumber
681 --> GetEntryVR</TT>
683 <LI> <TT>GetDocEntryByNumber
684 --> GetDocEntry</TT>
685 <LI> <TT>GetValEntryByNumber
686 --> GetValEntry</TT>
687 <LI> <TT>GetBinEntryByNumber
688 --> GetBinEntry</TT>
689 <LI> <TT>GetSeqEntryByNumber
690 --> GetSeqEntry</TT>
695 <!#######################################################################>
696 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
698 <A CLASS="anchor" NAME="NewsVersion0_6">
699 <B>Version 0.6 (June 8 2004)</B></A>
702 This version will be used by Insight Tool Kit
703 (<a href="http://www.itk.org">ITK</a> 2.0) at the beginning of 2005.<br>
704 It's not yet packaged ...<br><br>
705 <LI> <a href= "Doc0.6/html.user/index.html">User Documentation"</a>
706 <LI> <a href= "Doc0.6/html.developper/index.html">Developper Documentation"</a>
707 <LI> The new <TT>gdcmDocument</TT> class is a parent class of
708 <TT>gdcmHeader</TT> class and <TT>gdcmDicomDir</TT> class.
709 <LI> Massive modifications in the Class Diagram :
711 <LI> any dicom related file is a <TT>gdcmDocument</TT>
712 <LI> a <TT>gdcmDocument</TT> can be :
714 <LI> a <TT>gdcmHeader</TT>, if it contains pixel data
715 <LI> a <TT>gdcmDicomDir</TT>, if it contains only informations
716 on the files in a given directory
719 <LI> a <TT>gdcmDocument</TT> is_a <TT>gdcmElementSet</TT>,
720 composed of a set of <TT>gdcmEntry</TT> separated into :
722 <LI> <TT>gdcmValEntry</TT><br>
723 a specialization of <TT>gdcmValEntry</TT>, for 'non
724 <TT>std::string</TT> representable' values is
725 <TT>gdcmBinEntry</TT>
726 <LI> <TT>gdcmSeqEntry</TT> (VR = <TT>SQ</TT>, i.e Dicom Sequences)<br>
727 they are dealt as tree-like structures :<br>
728 - a <TT>gdcmSeqEntry</TT> is considered as a set
729 of <TT>gdcmSQItem</TT>,<br>
730 - a <TT>gdcmSQItem</TT> is_a <TT>gdcmElementSet</TT>, composed
731 of <TT>gdcmDocEntries</TT>, recursively <br>
734 <LI> Improvement of the jpeg sub-library: jpeg
735 compressed Dicom files (lossless and lossy)
736 might be read (check-it out)
739 <!#######################################################################>
740 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
742 <A CLASS="anchor" NAME="NewsVersion0_4">
743 <B>Version 0.4 (February 6 2004)</B></A>
747 <LI> <a href="Doc0.4/uml-gdcmV0.4.pdf">gdcm 0.4 UML Class Diagram</a>.
748 <LI> <a href= "Doc0.4/html.user/index.html">User Documentation"</a>
749 <LI> <a href= "Doc0.4/html.developper/index.html">Developper Documentation </a>
751 <LI> Introduction of a jpeg sub-library: some very simple jpeg-lossy
752 compressed Dicom files might be working (check-it out).
753 <LI> And also, fewer memory leaks, cleaned-up stl usage (should work
754 with gcc-3.x), python disutil installer (see file setup.py)
755 supporting both Swig and vtk wrapping.
756 <LI> Introduction of a RLE (Run-Time Encoding) library
757 <LI> Color images (RGB or Palette Color) are dealt with
758 <LI> Confusing names <TT>gdcmPatient</TT>, <TT>gdcmStudy</TT>,
759 <TT>gdcmSerie</TT>, <TT>gdcmPatient</TT> changed to
760 <TT>gdcmDicomDirPatient</TT>, <TT>gdcmDicomDirStudy</TT>,
761 <TT>gdcmDicomDirSerie</TT>, <TT>gdcmDicomDirPatient</TT>
765 <!#######################################################################>
766 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
768 <A CLASS="anchor" NAME="NewsVersion0_3">
769 <B>Version 0.3 (July 8 2003)</B></A>
772 <LI> <TT>gdcmFile</TT> class now enables acces to the data
773 i.e. the image[s] content. Previously only parsing of the
774 Dicom header was available through usage of <TT>gdcmHeader</TT>
776 <LI> a <A HREF="http://public.kitware.com/VTK/">VTK</A> plugin
777 of gdcm is now available through the <TT>vtkGdcmReader</TT>
778 vtk class (see it as a vtk wrapper of gdcm), which enables
780 <LI> Loading of a single image,
781 <LI> Loading of a stack of images from multiple Dicom files,
782 <LI> this class is wrapped for vtkPython (by using native vtk
785 <LI> Introduction of a jpeg sub-library: lossless-jpeg
786 compressed Dicom files work.
787 <LI> <TT>vtkgdcmViewer</TT> allows easy displaying of single/multiframe
788 GreyLevel/RGB/PaletteColor images
791 <!#######################################################################>
792 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
794 <A CLASS="anchor" NAME="NewsVersion0_1">
795 <B>Version 0.1 (April 1 2003)</B></A>
797 <!#######################################################################>
798 <HR size="1"><ADDRESS style="align: right;"></ADDRESS>
800 <A CLASS="anchor" name="NewsVersion0_1">
801 <B>Version 0.0 (March 14 2003)</B></A>
803 <HR size="1"><ADDRESS style="align: right;"></ADRESS>