X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=Doc%2FWebsite%2FNews.html;h=f17bb7b97616d8656f50eaae426ad6c6389af056;hb=d55a466e9ddf418376383378ace8241f73be0651;hp=8fd6068d254003c8451ac14e9ebd5cb00de2c790;hpb=1d595fc50b3ff10f6ab80d27e71c38828a7ddd25;p=gdcm.git diff --git a/Doc/Website/News.html b/Doc/Website/News.html index 8fd6068d..f17bb7b9 100644 --- a/Doc/Website/News.html +++ b/Doc/Website/News.html @@ -8,10 +8,10 @@ - +

Gdcm News

- +

@@ -21,101 +21,470 @@ We know the following are missing; don't loose time looking for them ...
We know they could be helpfull. We shall add them some day.
Any contribution is welcome. - - - - -

- Current Version + Current Version (CVS)

    +
  • Missing Features
  • State of the art
    • - gdcm UML Class Diagram current version. - + gdcm UML Class Diagram current version. +
    • User Documentation +
    • Developper + Documentation +
    • New Features +
        +
      • Stupid difference between gdcm::ValEntry + and gdcm::BinEntry removed.
        + Only gdcm::DataEntry exist, now. + Should have been considered as a 'Bug Fix'.
        + Actually, it's an API breaking modification ... +
      • SerieHelper :
        + Add some methods, to split a 'SingleSerieUID' Fileset into + 'Extra Coherent' FileSets.
        + They return a std::map of 'Filesets' (actually : std::vector + of gdcm::File*)
        + The key is the 'Orientation', the 'Position' + or the value of a user choosen 'Tag'
        + - XCoherentFileSetmap SplitOnOrientation(FileList *fileSet);
        + - XCoherentFileSetmap SplitOnPosition(FileList *fileSet);
        + - XCoherentFileSetmap SplitOnTagValue(FileList *fileSet, + uint16_t group, uint16_t element);
        + These methods must be called by user, depending on what he wants + to do, at application time.- *he* only knows what his Series + contain !- +
      -
    • New Features / Bug fixes +
    • API breaking modifications (since previous version)
        -
      • Both vtkgdcmViewer and vtkgdcmViewer2 - are available to allow easy displaying of single/multiframe - GreyLevel/RGB/PaletteColor images +
      • Stupid difference between gdcm::ValEntry + and gdcm::BinEntry removed.
        + Only gdcm::DataEntry exist, now.
        +
      • +
      • +
      + +
    • Bug fixes +
        +
      • Implicit VR - Big Endian (G.E Private) Transfert Syntax 16 Bits + images are now read correctly. +
      • File::GetZOrigin() returns accurate result in any case. +
      + +
    • Known Bugs +
        +
      • Use of Implicit Value Representation writting mode may + causes troubles, when there are some SQ belonging to a + Shadow Group.
        + Better you use Explicit Value Representation writting mode ... +
      • Troubles on 'Big endian' processors (i.e. Apple/Motorola, SunSparc + ...) when writting 16 Bits images. +
      • Troubles on 64-bits processors. +
      • +
      • +
      + +

      +
    -
  • A.P.I. breaking modifications (since previous version : 1.0) -
      + + + +
      +

      + + Version 1.1 (September 14 2005) +

      +
    • State of the art +
      • + gdcm 1.1 UML Class Diagram version. +
      • User Documentation +
      • Developper + Documentation +
      • New Features +
          +
        • Add the methods + gdcm::Dict:AddDict(std::string fullPathPrivateDictionaryFileName) +
          and
          + gdcm::Dict::RemoveDict(std::string fullPathPrivateDictionaryFileName) +
          + to allow user to choose the 'Private Dictionary' he wants to work with. +
          + One can dream about a better API;
          + This one allow right now anybody to see very easyly if the use + of a given private dicom dictionary is of any help or not. +

          +
        • + PrintFile has now a new command line argument manager option :
          + dict=fullPathNamePrivateDictionaryFile
          + to allow user to see with no extra coding what differences + makes the use or not of a private Dicom Dictionary.
          + e.g. : use it as follow
          + PrintFile filein=myGEdicomFile.dcm + dict=/user/userName/gdcm/Dicts/GEMS-Advance.dic +

        • + (Not a great one ...) + Stupid method names :
          DicomDir::WriteDicomDir() + and DicomDir::AnonymizeDicomDir()
          replaced by :
          + DicomDir::Write() + and DicomDir::Anonymize() +

          +
        • + void Document::AddForceLoadElement(uint16_t group, uint16_t elem); +
          + allows user to tell gdcm::Document Loader he wants + to force the loading of a given set of DocEntries, + even if their length exceeds the current + MAX_SIZE_LOAD_ELEMENT_VALUE. +

          +
        • + Many users expect from vtkGdcmReader it 'orders' the images + (that's the job of gdcm::SerieHelper ...)
          + When user knows the files with same Serie UID + have same sizes, same 'pixel' type, same color convention, ... + the right way to proceed is as follow : +
          +        gdcm::SerieHelper *sh= new gdcm::SerieHelper();
          +   //      if user wants *not* to load some parts of the file headers
          +        sh->SetLoadMode(loadMode);
          +
          +   //      if user wants *not* to load some files
          +        sh->AddRestriction(group, element, value, operator);
          +        sh->AddRestriction( ...
          +        sh->SetDirectory(directoryWithImages);
          +
          +   //      if user *knows* how to order his files
          +        sh->SetUserLessThanFunction(userSuppliedComparisonFunction);
          +   //      or/and
          +   //      if user wants to sort reverse order
          +        sh->SetSortOrderToReverse();
          +   
          +   //      here, we suppose only the first 'Single SerieUID' Fileset is of interest
          +   //      Just iterate using sh->NextSingleSerieUIDFileSet()
          +   //      if you want to get all of them
          +        gdcm::FileList *l = sh->GetFirstSingleSerieUIDFileSet();
          +
          +   //      if user is doesn't trust too much the files with same Serie UID
          +        if ( !sh->IsCoherent(l) )
          +           return; // not same sizes, or not same 'pixel type' -> stop
          +
          +        sh->OrderFileList(l);        // sort the list
          +
          +        vtkGdcmReader *reader = vtkGdcmReader::New();
          +   //      if user wants to modify pixel order (Mirror, TopDown, ...)
          +   //      he has to supply the function that does the job
          +   //      (a *very* simple example is given in vtkgdcmSerieViewer.cxx)
          +        reader->SetUserFunction (userSuppliedFunction);
          +
          +   //      to pass a 'Single SerieUID' Fileset as produced by gdcm::SerieHelper
          +        reader->SetCoherentFileList(l);
          +        reader->Update();
          +   
          + You can see a full example in vtk/vtkgdcmSerieViewer.cxx
          + e.g.
          + + vtkgdcmSerieViewer dirname=Dentist mirror
          + vtkgdcmSerieViewer dirname=Dentist reverse
          + vtkgdcmSerieViewer dirname=Dentist reverse topdown
          + +
          + +
        • vtkGdcmReader::SetUserFunction (userSuppliedFunction)
          + with :
          + void userSuppliedFunction(uint8_t *imageData, File *f);
          + allows user to reorganize the pixels of each image just after reading + it (to mirror, or topdown the image, for instance)
          + Note : uint8_t * doesn't mean it works only on 8 Bits images. +
          It's for prototyping. Feel free to cast it. +

          +
        • + SerieHelper::SetUserLessThanFunction(userSuppliedComparisonFunction) +
          with :
          + bool userSuppliedComparisonFunction(File *, File *);
          + allows user -when he knows more about his files than gdcm does- + to give his own comparison function. +
        • SerieHelper::SetSortOrderToReverse allows user to ask + to sort the Files reverse order. +
        • SerieHelper::AddRestriction has now a new constructor
          + AddRestriction(group, element, value, operator);
          + allows user to exclude some files from the sorting, according to + any comparison operator
          + (GDCM_EQUAL, GDCM_DIFFERENT, + GDCM_GREATER, GDCM_GREATEROREQUAL, + GDCM_LESS, GDCM_LESSOREQUAL), not only on the + equality. +

          +
        • AnonymizeNoLoad used with dirin=inputDirectoryName + anonymizes all the files within the given Directory. +
          + User may also choose extra elements he wants to rub out:
          + rubout=listOfElementsToRubOut
          + with listOfElementsToRubOut : group1-elem1,group2-elem2, + ... (in hexa, no space within the list ) +

          +
        • gdcm::SerieHelper() has a new method + void AddGdcmFile(File *header), that allows aware user to + create a 'FileList' (actually a + std::vector< File* > ).
          + The FileList created this way will be the + 'first one' in the gdcm::FileHelper() (retrieve it with + FileList *GetFirstCoherentFileList() ).
          + It may be sorted using OrderFileList.
          + No 'coherence check' will be performed on this FileList + before sorting.
          + It may be passed to a vtkGdcmReader + (to avoid parsing twice the files) +

          +
        • vtkGdcmReader can now get the result of + gdcm::SerieHelper (to avoid parsing twice the files)
          + Proceed as follow :
          +
          +           gdcmSerieHelper *sh = new gdcmSerieHelper();
          +           sh->SetDirectory(myImageDirectory, true);
          +           gdcmFileList *l = s->GetFirstCoherentFileList();
          +           s->OrderFileList(l);
          +
          +           vtkGdcmReader *gr = new vtkGdcmReader();
          +           gr->SetCoherentFileList(l);
          +           gr->Update();  
          +           
          + This works with a directory that contains only one 'Serie' + (same Serie UID for all the images).
          + If it contains more than one Serie, you'll have to loop + on the Series, using GetNextCoherentFileList();
          + It will be up to the user to delete the gdcm::File. +

          + See vtkgdcmSerieViewer for an example. +

          +
        • Both vtkgdcmViewer and vtkgdcmViewer2 + are available to allow easy displaying of single/multiframe + GreyLevel/RGB/PaletteColor images

          +
        • DICOMDIR anonymiser (Load and Noload mode) +

          +
        • Because the gdcm::DicomDir::Load() method may be used + either for loading an already made DICOMDIR file or for + parsing all the dicom files with a given root directory we + syntaxically separated the operations:
          + For loading an already made DICOMDIR file, use :
          +
          +           gdcm::DicomDir *d = new gdcm::DicomDir();
          +           d->SetFileName(fileName);
          +           d->Load( );  
          +           
          + + For parsing all the dicom files within a given root directory, use :
          +
          +           gdcm::DicomDir *d = new gdcm::DicomDir();
          +           d->SetDirectoryName(dirName);
          +           d->Load( )  
          +           
          + + Don't use any longer old deprecated style:
          + + gdcm::DicomDir *d = new gdcm::DicomDir();
          + d->SetParseDir(true); //
          or d->SetParseDir(false);
          + d->Load( fileName );
          +
          +
          +
        • User is now allowed to tell gdcm::Document constructor + he doesn't want to deal with SeqEntry + (every time it's possible, i.e for 'true length' Sequences)
          + and/or he doesn't want to deal with Shadow groups + (every time it's possible i.e. when element 0x0000 + exists for this Group)
          + or he doesn't want to deal with SeqEntry that belong to a + Shadow group (every time it's possible + -'true length' Sequence-)
          + use :
          +
          +           gdcm::File *f = new gdcm::File();
          +                  f->SetLoadMode(NO_SEQ);            | depending on what
          +                  f->SetLoadMode(NO_SHADOW);         | you want *not* 
          +                  f->SetLoadMode(NO_SEQ | NO_SHADOW);| to load from the
          +                  f->SetLoadMode(NO_SHADOWSEQ);      | target file
          +            f->SetFileName(fileName);
          +            f->Load( );
          +            
          + Don't use any longer old deprecated style:
          + + gdcm::File *f = new gdcm::File(fileName);
          +
          +
        • User is now allowed to tell gdcm::DicomDir constructor + he doesn't want to deal with SeqEntry + (every time it's possible, i.e for 'true length' Sequences)
          + and/or he doesn't want to deal with Shadow groups + (every time it's possible i.e. when element 0x0000 + exists for this Group)
          + or he doesn't want to deal with SeqEntry that belong to a + Shadow group (every time it's possible + -'true length' Sequence-)
          + when he parses all the Dicom files within a given directory.
          + use :
          +
          +             gdcm::DicomDir *f = new gdcm::DicomDir();
          +                  f->SetLoadMode(NO_SEQ);            | depending on what
          +                  f->SetLoadMode(NO_SHADOW);         | you want *not* 
          +                  f->SetLoadMode(NO_SEQ | NO_SHADOW);| to load from the files
          +                  f->SetLoadMode(NO_SHADOWSEQ);      | within the root directory 
          +             f->SetDirectoryName(rootDirectoryName);
          +             f->Load( );
          +            
          + Don't use any longer old deprecated style:
          + + gdcm::DicomDir *dcmdir = new gdcm::DicomDir(dirName, true);
          +
        +
      • Bug fixes +
          +
        • No more trouble when the 'endianess' switches within Sequences. +
        • No more trouble with 'no length Sequences' belonging to a + Shadow Group when they are 'Implicit VR'. +
        • The difference between MONOCHROME1 (low values = bright, + high values = dark) and MONOCHROME2 (low values = dark, + high values = bright) is now taken into account.
          + It's no longer up to the user to change the pixels value +
        • Writing a 'True Dicom' image after reading an ACR-NEMA image + does not request any longer from the user to build up + 'manually' the Meta Elements group (0x0002) +
        • Old '24 Bits' ACR-NEMA are now correctly re-written + in DICOM V3 mode. +
        • Element 0x0000 of Shadow groups is always forced to be a + ValEntry and its VR is forced to UL +

          +
        + +
      • A.P.I. breaking modifications (since previous version : 1.0) +
          +
        • NEVER more API breaking modifications !!! +

          +
      • Known bugs
          -
        • The difference between MONOCHROME1 and MONOCHROME2 - is not taken into account. It's up to the user to change the pixels - value -
        • Writing a 'True Dicom' image after reading an ACR-NEMA image requests - from the user to build up 'manually' the Meta Elements group (0002) -
        • Management, on Big Endian Processors, of unloaded BinEntries -
        • Old '24 Bits' ACR-NEMA are not correctly re-written in DICOM mode. +
        +
      +

      Version 1.0 (Feb 14 2005)

      - - - - -
      • State of the art
          -
        • - gdcm 1.0 UML Class Diagram version. -
        • User Documentation" -
        • Developper -Documentation" +
        • + gdcm 1.0 UML Class Diagram version. +
        • User Documentation" +
        • Developper + Documentation"
        • Final check of the jpeg sub-library: all 'classical' jpeg compressed Dicom files can be read
        • All the previously gdcm-breaker images are now readable
          @@ -126,18 +495,50 @@ Documentation"
        • A.P.I. breaking modifications (since previous version : 0.6)
            -
          • Use of namespace : all the methods formerly called - className::gdcmXxx() are now called className::Xxx() -
          • Removal of accessors GetXxxByname, SetXxxByname - and GetXxxByNumber, SetXxxByNumber - replaced by GetXxx, SetXxx -
          • a gdcm::Document is now specialized - in gdcm::DicomDir and gdcm::File +
          • Use of namespace : all the methods formerly named + className::gdcmXxx() are now named className::Xxx() +
            End user will have to call them as gdcm::className::Xxx() +
          • a gdcm::Document is now specialized in : +
              +
            • gdcm::DicomDir +
            • gdcm::File +
            +
          • a gdcm::DicomElementSet is composed of a set of + gdcm::DicomDocEntry +
          • a gdcm::DicomDocEntry can be : +
              +
            • a gdcm::ContentEntry, specialized in : +
                +
              • gdcm::ValEntry +
              • gdcm::BinEntry (no longer a specialization of + gdcm::ValEntry) +
              +
            • a gdcm::SeqEntry +
            +
          • Removal of useless accessors GetXxxByname, SetXxxByname +
          • Renaming of accessors GetXxxByNumber, SetXxxByNumber + as follow : +
              +
            • GetEntryByNumber +       + --> GetEntryValue +
            • GetEntryLengthByNumber --> GetEntryLength +
            • GetEntryOffsetByNumber --> GetEntryOffset +
            • GetEntryVRByNumber +     --> GetEntryVR +
            • +
            • GetDocEntryByNumber +    --> GetDocEntry +
            • GetValEntryByNumber +    --> GetValEntry +
            • GetBinEntryByNumber +    --> GetBinEntry +
            • GetSeqEntryByNumber +    --> GetSeqEntry +
          -
        -

        @@ -154,20 +555,30 @@ Documentation" gdcmHeader class and gdcmDicomDir class.
      • Massive modifications in the Class Diagram :
          -
        • Entries (gdcmEntry) are now separated into - ValEntry and SeqEntry (whose VR = - SQ) -
        • a gdcmDocument is_a gdcmElementSet, - composed of a set of gdcmValEntry - and gdcmSeqEntry -
        • a gdcmSeqEntry is considered as a set - of gdcmSQItem -
        • Dicom Sequences (VR = SQ) are now dealt as tree-like - structures within gdcmSQItem class.
          - they are considered as a set of gdcmSQItems -
        • a gdcmSQItem is_a gdcmElementSet -
        -
      • Improvement of the jpeg sub-library: jpeg +
      • any dicom related file is a gdcmDocument +
      • a gdcmDocument can be : +
          +
        • a gdcmHeader, if it contains pixel data +
        • a gdcmDicomDir, if it contains only informations + on the files in a given directory +
        + +
      • a gdcmDocument is_a gdcmElementSet, + composed of a set of gdcmEntry separated into : +
          +
        • gdcmValEntry
          + a specialization of gdcmValEntry, for 'non + std::string representable' values is + gdcmBinEntry +
        • gdcmSeqEntry (VR = SQ, i.e Dicom Sequences)
          + they are dealt as tree-like structures :
          + - a gdcmSeqEntry is considered as a set + of gdcmSQItem,
          + - a gdcmSQItem is_a gdcmElementSet, composed + of gdcmDocEntries, recursively
          +
        +
      +
    • Improvement of the jpeg sub-library: jpeg compressed Dicom files (lossless and lossy) might be read (check-it out)
    @@ -192,7 +603,7 @@ Documentation"
  • Introduction of a RLE (Run-Time Encoding) library
  • Color images (RGB or Palette Color) are dealt with
  • Confusing names gdcmPatient, gdcmStudy, - gdcmDicomDirSerie, gdcmDicomDirPatient changed to + gdcmSerie, gdcmPatient changed to gdcmDicomDirPatient, gdcmDicomDirStudy, gdcmDicomDirSerie, gdcmDicomDirPatient