From e4071f248493a36a1b8109fffcb924a255152b36 Mon Sep 17 00:00:00 2001 From: jpr Date: Wed, 9 Feb 2005 14:39:48 +0000 Subject: [PATCH] Some more examples --- Example/CMakeLists.txt | 6 +- Example/exColorToRGB.cxx | 145 +++++++++++++++++++++++++++ Example/exGC.cxx | 199 +++++++++++++++++++++++++++++++++++++ Example/exImageLighten.cxx | 140 ++++++++++++++++++++++++++ 4 files changed, 489 insertions(+), 1 deletion(-) create mode 100644 Example/exColorToRGB.cxx create mode 100644 Example/exGC.cxx create mode 100644 Example/exImageLighten.cxx diff --git a/Example/CMakeLists.txt b/Example/CMakeLists.txt index 49a7f835..87aeb09b 100644 --- a/Example/CMakeLists.txt +++ b/Example/CMakeLists.txt @@ -10,7 +10,11 @@ SET(EXAMPLE_SOURCES exReadPapyrus exReadWriteFile exAnonymize - + exAnonymizeNoLoad + exColorToRGB + exGC + exImageLighten + #the following are utilities PrintDicomDir PrintDocument diff --git a/Example/exColorToRGB.cxx b/Example/exColorToRGB.cxx new file mode 100644 index 00000000..15263fb0 --- /dev/null +++ b/Example/exColorToRGB.cxx @@ -0,0 +1,145 @@ +/*========================================================================= + + Program: gdcm + Module: $RCSfile: exColorToRGB.cxx,v $ + Language: C++ + Date: $Date: 2005/02/09 14:39:48 $ + Version: $Revision: 1.1 $ + + Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de + l'Image). All rights reserved. See Doc/License.txt or + http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ + +#include "gdcmFile.h" +#include "gdcmFileHelper.h" +#include "gdcmDocument.h" +#include "gdcmValEntry.h" +#include "gdcmBinEntry.h" +#include "gdcmSeqEntry.h" + + +int main(int argc, char *argv[]) +{ + + std::cout << "------------------------------------------------" << std::endl; + std::cout << "Tranforms a full gdcm-readable 'color' Dicom image " + << " (e.g Palette Color, YBR, 3-Planes RGB) " + << " into an 'RGB_Pixels' Dicom Image " + << " " << std::endl; + + if (argc < 3) + { + std::cerr << "Usage :" << std::endl << + argv[0] << " input_dicom output_dicom" << std::endl; + return 1; + } + + std::string fileName = argv[1]; + std::string output = argv[2]; + + +// ============================================================ +// Read the input image. +// ============================================================ + // a gdcm::File contains all the Dicom Field but the Pixels Element + + gdcm::File *f1= new gdcm::File( fileName ); + + + std::cout << argv[1] << std::endl; + + f1 = new gdcm::File( fileName ); + if (!f1->IsReadable()) { + std::cerr << "Sorry, " << fileName <<" not a gdcm-readable " + << "DICOM / ACR File" + <IsMonochrome()) { + std::cerr << "Sorry, " << fileName <<" not a 'color' File " + << " " + <GetImageData(); + + if ( imageData == 0 ) + { + std::cerr << "Sorry, Pixels of" << fileName <<" are not " + << " gdcm-readable." << std::endl; + return 0; + } + + + + + // ------ User wants write a new image without shadow groups ------------- + // ------ without Sequences ------------- + + + gdcm::FileHelper *copy = new gdcm::FileHelper( output ); + + gdcm::DocEntry *d = f1->GetFirstEntry(); + while(d) + { + // We skip SeqEntries, since user cannot do much with them + if ( !(dynamic_cast(d)) + // We skip Shadow Groups, since nobody knows what they mean + && !( d->GetGroup()%2 ) ) + { + + if ( gdcm::BinEntry *b = dynamic_cast(d) ) + { + copy->GetFile()->InsertBinEntry( b->GetBinArea(),b->GetLength(), + b->GetGroup(),b->GetElement(), + b->GetVR() ); + } + else if ( gdcm::ValEntry *v = dynamic_cast(d) ) + { + copy->GetFile()->InsertValEntry( v->GetValue(), + v->GetGroup(),v->GetElement(), + v->GetVR() ); + } + else + { + // We skip gdcm::SeqEntries + } + } + d = f1->GetNextEntry(); + } + + // User knows the image is a 'color' one -RGB, YBR, Palette Color- + // and wants to write it as RGB + copy->SetImageData(imageData, fh1->GetImageDataSize()); + copy->SetWriteModeToRGB(); + + copy->WriteDcmExplVR( output ); + + + delete f1; + delete fh1; + delete copy; + + exit (0); +} + diff --git a/Example/exGC.cxx b/Example/exGC.cxx new file mode 100644 index 00000000..25bb6454 --- /dev/null +++ b/Example/exGC.cxx @@ -0,0 +1,199 @@ +/*========================================================================= + + Program: gdcm + Module: $RCSfile: exGC.cxx,v $ + Language: C++ + Date: $Date: 2005/02/09 14:39:48 $ + Version: $Revision: 1.1 $ + + Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de + l'Image). All rights reserved. See Doc/License.txt or + http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ + +#include "gdcmFile.h" +#include "gdcmFileHelper.h" +#include "gdcmDocument.h" +#include "gdcmValEntry.h" +#include "gdcmBinEntry.h" +#include "gdcmSeqEntry.h" + +typedef struct // Maybe we should add it to gdcm ? +{ + uint8_t r; + uint8_t g; + uint8_t b; +} rgb8_t; + + +// This small application, for a given Creatis user (G.C.) +// may be taken as an example + +int main(int argc, char *argv[]) +{ + + // we need a user friendly way for passign parameters on the command line ! + + std::cout << "------------------------------------------------" << std::endl; + std::cout << "Transforms a full gdcm-readable 'color' Dicom image " + << " (e.g Palette Color, YBR, 3-Planes RGB) " + << " into an 'RGB_Pixels' Dicom Image " << std::endl + << " Blacks out any 'grey' pixel (r=g=b) " + << " Blacks out any 'dark' pixel (r,g,b < threshold) " + << " " << std::endl; + std::cout << "------------------------------------------------" << std::endl; + + if (argc < 3) + { + std::cerr << "Usage :" << std::endl << + argv[0] << " input_dicom output_dicom threshold background" << std::endl; + return 1; + } + + std::string fileName = argv[1]; + std::string output = argv[2]; + + int threshold = 0; + if (argc > 3) + threshold = atoi( argv[3] ); + + int background = 0; + if (argc > 4) + background = atoi( argv[4] ); + +// ============================================================ +// Read the input image. +// ============================================================ + // a gdcm::File contains all the Dicom Field but the Pixels Element + + gdcm::File *f1= new gdcm::File( fileName ); + + + std::cout << argv[1] << std::endl; + + f1 = new gdcm::File( fileName ); + if (!f1->IsReadable()) { + std::cerr << "Sorry, " << fileName <<" not a gdcm-readable " + << "DICOM / ACR File" + <IsMonochrome()) { + std::cerr << "Sorry, " << fileName <<" not a 'color' File " + << " " + <GetImageData(); + + if ( imageData == 0 ) + { + std::cerr << "Sorry, Pixels of" << fileName <<" are not " + << " gdcm-readable." << std::endl; + return 0; + } + + // ------ User wants write a new image without shadow groups ------------- + // ------ without Sequences ------------- + + + gdcm::FileHelper *copy = new gdcm::FileHelper( output ); + + gdcm::DocEntry *d = f1->GetFirstEntry(); + while(d) + { + // We skip SeqEntries, since user cannot do much with them + if ( !(dynamic_cast(d)) + // We skip Shadow Groups, since nobody knows what they mean + && !( d->GetGroup()%2 ) ) + { + + if ( gdcm::BinEntry *b = dynamic_cast(d) ) + { + copy->GetFile()->InsertBinEntry( b->GetBinArea(),b->GetLength(), + b->GetGroup(),b->GetElement(), + b->GetVR() ); + } + else if ( gdcm::ValEntry *v = dynamic_cast(d) ) + { + copy->GetFile()->InsertValEntry( v->GetValue(), + v->GetGroup(),v->GetElement(), + v->GetVR() ); + } + else + { + // We skip gdcm::SeqEntries + } + } + d = f1->GetNextEntry(); + } + + int imageSize = fh1->GetImageDataSize(); +// Black up all 'grey' pixels + int n = 0; + for (int i = 0; iSetImageData(imageData, imageSize); + copy->SetWriteModeToRGB(); + + copy->WriteDcmExplVR( output ); + + delete f1; + delete fh1; + delete copy; + + exit (0); +} diff --git a/Example/exImageLighten.cxx b/Example/exImageLighten.cxx new file mode 100644 index 00000000..16ae6e88 --- /dev/null +++ b/Example/exImageLighten.cxx @@ -0,0 +1,140 @@ +/*========================================================================= + + Program: gdcm + Module: $RCSfile: exImageLighten.cxx,v $ + Language: C++ + Date: $Date: 2005/02/09 14:39:49 $ + Version: $Revision: 1.1 $ + + Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de + l'Image). All rights reserved. See Doc/License.txt or + http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ + +#include "gdcmFile.h" +#include "gdcmFileHelper.h" +#include "gdcmDocument.h" +#include "gdcmValEntry.h" +#include "gdcmBinEntry.h" +#include "gdcmSeqEntry.h" + +int main(int argc, char *argv[]) +{ + gdcm::File *f1; + + std::cout << "-----------------------------------------------" << std::endl; + std::cout << "Removes from a full gdcm-readable Dicom image" << std::endl; + std::cout << " all the 'Shadow groups' and the 'Sequence' entries" + << " Warning : 'Compressed images' are uncompressed" + << std::endl + << " : 'YBR images' are converted into 'RGB images'" + << std::endl + << " : 'RGB planes' are converted into 'RGB pixels'" + << std::endl + << " : 'Palette Color images' are kept 'as is'" + << std::endl; + std::cout << "-----------------------------------------------" << std::endl; + + if( argc < 3 ) + { + std::cerr << "Usage " << argv[0] << " Source image.dcm " + << " Output image.dcm " << std::endl; + return 1; + } + + std::string fileName = argv[1]; + std::string output = argv[2]; + +// ============================================================ +// Read the input image. +// ============================================================ + + std::cout << argv[1] << std::endl; + + f1 = new gdcm::File( fileName ); + if (!f1->IsReadable()) { + std::cerr << "Sorry, " << fileName <<" not a gdcm-readable " + << "DICOM / ACR File" + <GetImageDataRaw(); + // Get the image data size + size_t dataRawSize = fh1->GetImageDataRawSize(); + +// ============================================================ +// Create a new gdcm::Filehelper, to hold new image. +// ============================================================ + + gdcm::FileHelper *copy = new gdcm::FileHelper( output ); + +// ============================================================ +// Selective copy of the entries (including Pixel Element). +// ============================================================ + + gdcm::DocEntry *d = f1->GetFirstEntry(); + + d = f1->GetFirstEntry(); + while(d) + { + // We skip SeqEntries, since user cannot do much with them + if ( !(dynamic_cast(d)) + // We skip Shadow Groups, since nobody knows what they mean + && !( d->GetGroup()%2 ) ) + { + + if ( gdcm::BinEntry *b = dynamic_cast(d) ) + { + copy->GetFile()->InsertBinEntry( b->GetBinArea(),b->GetLength(), + b->GetGroup(),b->GetElement(), + b->GetVR() ); + } + else if ( gdcm::ValEntry *v = dynamic_cast(d) ) + { + copy->GetFile()->InsertValEntry( v->GetValue(), + v->GetGroup(),v->GetElement(), + v->GetVR() ); + } + else + { + // We skip gdcm::SeqEntries + } + } + d = f1->GetNextEntry(); + } + + // User wants to keep the Palette Color -if any- + // and write the image as it was + copy->SetImageData(imageDataRaw, dataRawSize); + copy->SetWriteModeToRaw(); + copy->WriteDcmExplVR( output ); + + std::cout << std::endl + << "------------------------------------------------------------" + << std::endl; + delete f1; + delete fh1; + delete copy; + + exit (0); +} + -- 2.45.1