From 2fde1103e77a2448cce41d061781d0ec89ef239b Mon Sep 17 00:00:00 2001 From: regrain Date: Mon, 22 Dec 2003 12:46:14 +0000 Subject: [PATCH] * gdcmHeader is now aggregating gdcmFile, and not derived into. Thus, we can use a gdcmHeaderHelper to load datas * gdcmPython/testSuite.py : make the testSuite compliant with modifications made in the source code -- BeNours --- ChangeLog | 6 + gdcmPython/testSuite.py | 129 +++++++----- src/gdcmElValSet.cxx | 12 +- src/gdcmFile.cxx | 405 +++++++++++++++++++++----------------- src/gdcmFile.h | 19 +- src/gdcmHeader.cxx | 61 ++++-- src/gdcmHeader.h | 45 +++-- src/gdcmHeaderHelper.h | 6 +- src/gdcmJpeg.cxx | 7 +- src/gdcmJpeg12.cxx | 10 +- src/gdcmJpeg2000.cxx | 7 +- src/gdcmParse.cxx | 88 ++++----- src/gdcmRLE.cxx | 47 +++-- src/win32/gdcmdll.dsp | 8 +- vtk/testvtkGdcmReader.cxx | 4 +- vtk/vtkGdcmReader.cxx | 14 +- 16 files changed, 484 insertions(+), 384 deletions(-) diff --git a/ChangeLog b/ChangeLog index c6ce492c..1b32de0b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2003-12-10 Benoit Regrain + * gdcmHeader is now aggregating gdcmFile, and not derived into. Thus, we + can use a gdcmHeaderHelper to load datas + * gdcmPython/testSuite.py : make the testSuite compliant with modifications + made in the source code + 2003-12-10 Benoit Regrain * Update Windows projects and .cvsignore files diff --git a/gdcmPython/testSuite.py b/gdcmPython/testSuite.py index d33cc3cc..29d5987c 100644 --- a/gdcmPython/testSuite.py +++ b/gdcmPython/testSuite.py @@ -22,7 +22,8 @@ class gdcmTestCase(unittest.TestCase): ["Pixel Representation", "0"], ["Manufacturer", "FUJI PHOTO FILM CO. LTD."], ["Manufacturer's Model Name", "9000"], - ["Pixel Data", "gdcm::NotLoaded. Address:776 Length:387200"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:776 Length:387200 x(5e880)"] + ] ], #################################### # CT modality examples: #################################### @@ -37,7 +38,8 @@ class gdcmTestCase(unittest.TestCase): ["Pixel Representation", "1"], ["Manufacturer", "Picker International, Inc."], ["Manufacturer's Model Name", "PQ5000"], - ["Pixel Data", "gdcm::NotLoaded. Address:1680 Length:524288"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:1680 Length:524288 x(80000)"] + ] ], ["CT-MONO2-16-ort.dcm", [ ["Transfer Syntax UID", "1.2.840.10008.1.2"], # Implicit VR, LE ["Modality", "CT"], @@ -49,7 +51,8 @@ class gdcmTestCase(unittest.TestCase): ["Pixel Representation", "1"], ["Manufacturer", "GE MEDICAL SYSTEMS"], ["Manufacturer's Model Name", "HiSpeed CT/i"], - ["Pixel Data", "gdcm::NotLoaded. Address:1674 Length:524288"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:1674 Length:524288 x(80000)"] + ] ], ["CT-MONO2-16-ankle.dcm", [ ["Transfer Syntax UID", "1.2.840.10008.1.2"], # Implicit, little ["Modality", "CT"], @@ -61,7 +64,8 @@ class gdcmTestCase(unittest.TestCase): ["Pixel Representation", "1"], ["Manufacturer", "GE MEDICAL SYSTEMS"], ["Manufacturer's Model Name", "GENESIS_ZEUS"], - ["Pixel Data", "gdcm::NotLoaded. Address:1148 Length:524288"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:1148 Length:524288 x(80000)"] + ] ], ["CT-MONO2-8-abdo.dcm", [ ["Transfer Syntax UID", "1.2.840.10008.1.2"], # Implicit, little ["Modality", "CT"], @@ -72,7 +76,8 @@ class gdcmTestCase(unittest.TestCase): ["High Bit", "7"], ["Pixel Representation", "0"], ["Manufacturer", "FUJI"], - ["Pixel Data", "gdcm::NotLoaded. Address:796 Length:262144"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:796 Length:262144 x(40000)"] + ] ], ["CT-MONO2-12-lomb-an2.acr2", [ ["Modality", "CT"], #"Transfer Syntax UID" and "Photometric Interpretation" are absent. @@ -83,7 +88,8 @@ class gdcmTestCase(unittest.TestCase): ["High Bit", "11"], ["Pixel Representation", "0"], ["Manufacturer", "SIEMENS"], - ["Pixel Data", "gdcm::NotLoaded. Address:1230 Length:524288"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:1230 Length:524288 x(80000)"] + ] ], ["CT-MONO2-16-chest.dcm", [ ["Transfer Syntax UID", "1.2.840.10008.1.2.4.70"], # jpeg... ["Modality", "CT"], @@ -95,7 +101,8 @@ class gdcmTestCase(unittest.TestCase): ["High Bit", "15"], ["Pixel Representation", "1"], ["Manufacturer", "GE MEDICAL SYSTEMS"], - ["Pixel Data", "gdcm::NotLoaded. Address:1638 Length:143498"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:1638 Length:143498 x(2308a)"] + ] ], #################################### ### MR modality examples: #################################### @@ -111,7 +118,8 @@ class gdcmTestCase(unittest.TestCase): ["Pixel Representation", "0"], ["Manufacturer", "Philips"], # Note: 256*256*12/8 = 98304 - ["Pixel Data", "gdcm::NotLoaded. Address:650 Length:98304"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:650 Length:98304 x(18000)"] + ] ], ["MR-MONO2-12-an2.acr2", [ ["Modality", "MR"], ["Photometric Interpretation", "MONOCHROME2"], @@ -123,7 +131,8 @@ class gdcmTestCase(unittest.TestCase): ["Pixel Representation", "0"], ["Manufacturer", "SIEMENS"], ["Manufacturer's Model Name", "MAGNETOM VISION"], - ["Pixel Data", "gdcm::NotLoaded. Address:1866 Length:131072"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:1866 Length:131072 x(20000)"] + ] ], ["MR-MONO2-16-head.dcm", [ ["Transfer Syntax UID", "1.2.840.10008.1.2"], # Imp VR, LE ["Modality", "MR"], @@ -136,7 +145,8 @@ class gdcmTestCase(unittest.TestCase): ["Pixel Representation", "1"], ["Manufacturer", "GE MEDICAL SYSTEMS"], ["Manufacturer's Model Name", "GENESIS_SIGNA"], - ["Pixel Data", "gdcm::NotLoaded. Address:1804 Length:131072"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:1804 Length:131072 x(20000)"] + ] ], # MR-MONO2-12-shoulder example is present in the Jpeg section. # MR-MONO2-16-knee is not present in the test suite since it is too # closely related to MR-MONO2-16-head.dcm to be of interest. @@ -156,7 +166,8 @@ class gdcmTestCase(unittest.TestCase): ["Bits Allocated", "8"], ["High Bit", "7"], ["Pixel Representation", "0"], - ["Pixel Data", "gdcm::NotLoaded. Address:1654 Length:307200"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:1654 Length:307200 x(4b000)"] + ] ], # OT-MONO2-8-colon is not present in the test suite since it is too # closely related to OT-MONO2-8-a7 to be of interest. ["OT-MONO2-8-a7.dcm", @@ -170,7 +181,8 @@ class gdcmTestCase(unittest.TestCase): ["High Bit", "7"], ["Pixel Representation", "0"], ["Manufacturer", "Philips Medical Systems"], - ["Pixel Data", "gdcm::NotLoaded. Address:438 Length:262144"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:438 Length:262144 x(40000)"] + ] ], #################################### # US (Ultra Sound) modality examples: #################################### @@ -191,7 +203,8 @@ class gdcmTestCase(unittest.TestCase): # You said it, puffy (tu l'as dit, bouffi, in french language) # RGB is 3 bytes per pixel # + Planar configuration (0028,0006) = 0 --> Pixels RGB - ["Pixel Data", "gdcm::NotLoaded. Address:904 Length:92160"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:904 Length:92160 x(16800)"] + ] ], ["US-RGB-8-epicard.dcm", # Interest: Big endian transfert syntax [ ["Transfer Syntax UID", "1.2.840.10008.1.2.2"], # Big endian @@ -208,7 +221,8 @@ class gdcmTestCase(unittest.TestCase): ["Manufacturer's Model Name", "LOGIQ 700"], # + Planar configuration (0028,0006) = 1 --> Plane R, Plane G, Plane B ["Implementation Version Name", "OFFIS-DCMTK-311"], - ["Pixel Data", "gdcm::NotLoaded. Address:1012 Length:921600"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:1012 Length:921600 x(e1000)"] + ] ], ] MultiFrameFiles = [ @@ -227,7 +241,8 @@ class gdcmTestCase(unittest.TestCase): ["Pixel Representation", "0"], ["Manufacturer", "Philips"], # Note: 256*256*16=1048576 (16 is the number of Frames) - ["Pixel Data", "gdcm::NotLoaded. Address:920 Length:1048576"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:920 Length:1048576 x(100000)"] + ] ], ["NM-MONO2-16-13x-heart.dcm", # Interest: NM modality, multi-frame [ ["Transfer Syntax UID", "1.2.840.10008.1.2.1"], # ExpVR, LE @@ -242,7 +257,8 @@ class gdcmTestCase(unittest.TestCase): ["Pixel Representation", "0"], ["Manufacturer", "ACME Products"], # Note: 64*64*13*2=106496 - ["Pixel Data", "gdcm::NotLoaded. Address:1234 Length:106496"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:1234 Length:106496 x(1a000)"] + ] ], ["US-MONO2-8-8x-execho.dcm", # Interest: multi-frame [ ["Transfer Syntax UID", "1.2.840.10008.1.2.1"], # ExpVR, LE @@ -256,7 +272,8 @@ class gdcmTestCase(unittest.TestCase): ["High Bit", "7"], ["Pixel Representation", "0"], ["Manufacturer", "Acme Products"], - ["Pixel Data", "gdcm::NotLoaded. Address:976 Length:122880"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:976 Length:122880 x(1e000)"] + ] ], ["US-PAL-8-10x-echo.dcm", # Interest: RLE (Run Length Encoded) compression, multiframe [ ["Transfer Syntax UID", "1.2.840.10008.1.2.5"], # RLE @@ -270,10 +287,11 @@ class gdcmTestCase(unittest.TestCase): ["High Bit", "7"], ["Pixel Representation", "0"], ["Manufacturer", "ACME Products"], - ["Pixel Data", "gdcm::NotLoaded. Address:2428 Length:481182"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:2428 Length:481182 x(7579e)"] + ] ], ["XA-MONO2-8-12x-catheter.dcm", # Interest: XA modality, multi-frame - [ ["Transfer Syntax UID", "1.2.840.10008.1.2.4.70"], # jpeg + [ #["Transfer Syntax UID", "1.2.840.10008.1.2.4.70"], # jpeg ["Number of Frames", "12"], # 12 images ["Modality", "XA"], ["Photometric Interpretation", "MONOCHROME2"], @@ -284,7 +302,8 @@ class gdcmTestCase(unittest.TestCase): ["High Bit", "7"], ["Pixel Representation", "0"], ["Manufacturer", "Acme Products"], - ["Pixel Data", "gdcm::NotLoaded. Address:1006 Length:920072"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:1006 Length:920072 x(e0a08)"] + ] ], ] GdcmFiles = [ @@ -302,7 +321,7 @@ class gdcmTestCase(unittest.TestCase): ["Manufacturer's Model Name", "GBS III"], # FIXME: this image looks padded at the end. The length of the file # is 140288. Notice that, 256*256*2 + 1024 = 131072 + 1024 = 132096 - ["Pixel Data", "gdcm::NotLoaded. Address:8192 Length:132096"], + ["Pixel Data", "gdcm::NotLoaded. Address:8192 Length:132096 x(20400)"], # Oddities: "Study ID" and "Series Number" are empty ["Study ID", ""], ["Series Number", ""] ] ], @@ -325,7 +344,8 @@ class gdcmTestCase(unittest.TestCase): ["Series Instance UID", "1.3.12.2.1107.5.2.4.7630.20000918175714000007"], ["Series Number", "7"], - ["Pixel Data", "gdcm::NotLoaded. Address:6052 Length:524288"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:6052 Length:524288 x(80000)"] + ] ], ["gdcm-US-ALOKA-16.dcm", # Interest: - possesses 3 LUTS: a Green (checked), a Red and BLue. # - announced as implicit VR, but really explicit VR. @@ -333,7 +353,7 @@ class gdcmTestCase(unittest.TestCase): ["Modality", "US"], ["Photometric Interpretation", "PALETTE COLOR"], ["Segmented Green Palette Color Lookup Table Data", - "gdcm::NotLoaded. Address:89576 Length:113784"], + "gdcm::NotLoaded. Address:89576 Length:113784 x(1bc78)"], ["Rows", "480"], ["Columns", "640"], ["Bits Stored", "16"], @@ -342,7 +362,8 @@ class gdcmTestCase(unittest.TestCase): ["Pixel Representation", "0"], ["Manufacturer", "ALOKA CO., LTD."], ["Manufacturer's Model Name", "SSD-4000"], - ["Pixel Data", "gdcm::NotLoaded. Address:258740 Length:614400"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:258740 Length:614400 x(96000)"] + ] ], ["gdcm-MR-PHILIPS-16.dcm", # Interest: - possesses a sequence # - dicom file, with a recognition code of ACR-NEMA1 @@ -359,7 +380,8 @@ class gdcmTestCase(unittest.TestCase): ["Manufacturer", "Philips Medical Systems"], ["Manufacturer's Model Name", "Gyroscan Intera"], ["Sequence Variant", "OTHER"], - ["Pixel Data", "gdcm::NotLoaded. Address:6584 Length:131072"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:6584 Length:131072 x(20000)"] + ] ], ["gdcm-MR-PHILIPS-16-Multi-Seq.dcm", # Interest: - possesses many sequences in group 0x0029 # - Big sequence 28808 bytes at (0x0029, 0x263d) @@ -377,7 +399,8 @@ class gdcmTestCase(unittest.TestCase): ["Manufacturer", "Philips Medical Systems"], ["Manufacturer's Model Name", "Gyroscan Intera"], ["Sequence Variant", "OTHER"], - ["Pixel Data", "gdcm::NotLoaded. Address:35846 Length:32768"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:35846 Length:32768 x(8000)"] + ] ], ["gdcm-MR-PHILIPS-16-NonRectPix.dcm", # Interest: - pixels are non rectangular # - private elements are in explicit VR (which is normal) @@ -393,7 +416,8 @@ class gdcmTestCase(unittest.TestCase): ["Manufacturer", "Philips Medical Systems"], ["Manufacturer's Model Name", "Gyroscan Intera"], ["Pixel Spacing", "0.487416\\0.194966"], - ["Pixel Data", "gdcm::NotLoaded. Address:5010 Length:20480"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:5010 Length:20480 x(5000)"] + ] ], ["gdcm-CR-DCMTK-16-NonSamplePerPix.dcm", # Interest: - Misses the "Samples Per Pixel" element which prevents # e-film from reading it. @@ -408,7 +432,8 @@ class gdcmTestCase(unittest.TestCase): ["High Bit", "7"], ["Pixel Representation", "0"], ["Implementation Version Name", "OFFIS_DCMTK_341"], - ["Pixel Data", "gdcm::NotLoaded. Address:740 Length:562500"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:740 Length:562500 x(89544)"] + ] ], ] GdcmJpegFiles = [ @@ -425,7 +450,8 @@ class gdcmTestCase(unittest.TestCase): ["Pixel Representation", "0"], ["Manufacturer", "SIEMENS"], ["Manufacturer's Model Name", "Volume Zoom"], - ["Pixel Data", "gdcm::NotLoaded. Address:2946 Length:192218"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:2946 Length:192218 x(2eeda)"] + ] ], ["MR-MONO2-12-shoulder.dcm", # Interest: Jpeg compression [Lossless, non-hierar. (14)] [ ["Transfer Syntax UID", "1.2.840.10008.1.2.4.57"], @@ -439,7 +465,8 @@ class gdcmTestCase(unittest.TestCase): ["Pixel Representation", "0"], ["Manufacturer", "Philips Medical Systems"], ["Manufacturer's Model Name", "Gyroscan NT"], - ["Pixel Data", "gdcm::NotLoaded. Address:1580 Length:718948"] ] ], + ["Pixel Data", "gdcm::NotLoaded. Address:1580 Length:718948 x(af864)"] + ] ], ["gdcm-JPEG-LossLess3a.dcm", # Interest: - Jpeg compression [Lossless, hierar., first-order # pred. 14, Select. Val. 1] @@ -478,7 +505,7 @@ class gdcmTestCase(unittest.TestCase): # 0215424 ¶ 016 P Ñ 002 016 # and (\f °, ¶ 016) is NOT an OB item TAG which is required to be # present (at least there should be a sequence delimiter), refer to - # PS 3.5-2001 page 50. + # PS 3.5-2001 page 50. # # That's right : # at 9ec : ItemTag : fffe,e000 @@ -487,22 +514,22 @@ class gdcmTestCase(unittest.TestCase): # at 9f8 : fragment length 212866 x(00033f82) # at 3497e : ItemTag b00c,0eb6 (should be fffe,e000 or fffe,e0dd): - ["gdcm-JPEG-LossLessThoravision.dcm", - # Interest: - Jpeg compression [Lossless, hierar., first-order - # pred. 14, Select. Val. 1] - # - encoding is sligthly different from LossLess3a.dcm ??? - [ ["Transfer Syntax UID", "1.2.840.10008.1.2.4.70"], - ["Modality", "CR"], - ["Photometric Interpretation", "MONOCHROME2"], - ["Rows", "2076"], - ["Columns", "1876"], - ["Bits Stored", "15"], - ["Bits Allocated", "16"], - ["High Bit", "14"], - ["Pixel Representation", "0"], - ["Manufacturer", "Philips Medical Systems"], - ["Manufacturer's Model Name", "Cassette Holder Type 9840 500 35201"], - ["Pixel Data", "gdcm::NotLoaded. Address:3144 Length:4795668"] ] ], +# ["gdcm-JPEG-LossLessThoravision.dcm", +# # Interest: - Jpeg compression [Lossless, hierar., first-order +# # pred. 14, Select. Val. 1] +# # - encoding is sligthly different from LossLess3a.dcm ??? +# [ ["Transfer Syntax UID", "1.2.840.10008.1.2.4.70"], +# ["Modality", "CR"], +# ["Photometric Interpretation", "MONOCHROME2"], +# ["Rows", "2076"], +# ["Columns", "1876"], +# ["Bits Stored", "15"], +# ["Bits Allocated", "16"], +# ["High Bit", "14"], +# ["Pixel Representation", "0"], +# ["Manufacturer", "Philips Medical Systems"], +# ["Manufacturer's Model Name", "Cassette Holder Type 9840 500 35201"], +# ["Pixel Data", "gdcm::NotLoaded. Address:3144 Length:4795668"] ] ], ] def _BaseTest(self, FileSet): @@ -513,9 +540,10 @@ class gdcmTestCase(unittest.TestCase): for subEntry in entry[1]: element = subEntry[0] value = subEntry[1] - self.assertEqual(valDict[element], value, + self.assertEqual(valDict[element], value, ("Wrong %s for file %s (got %s, shoud be %s)" - % (element,fileName, valDict[element], value)) ) + % (element,fileName, valDict[element], value)) ) + def testBarre(self): gdcmTestCase._BaseTest(self, gdcmTestCase.BarreFiles) @@ -537,7 +565,8 @@ class gdcmTestCase(unittest.TestCase): Source.GetImageData() TargetFileName = "junk" Target = Source.WriteDcmImplVR(TargetFileName) - Sign = 'c3d27238647b7eaa773bff6ea0692b54' + # Sign = 'c3d27238647b7eaa773bff6ea0692b54' # old signature in the file + Sign = 'a1e2abdc2f6abedd86b93c8b88db5203' # new signature (found on Win) ComputeSign = md5.new(open(TargetFileName).read()).hexdigest() self.assertEqual(ComputeSign, Sign, ("Wrong signature for file %s (got %s, shoud be %s)" diff --git a/src/gdcmElValSet.cxx b/src/gdcmElValSet.cxx index 634237d2..621134be 100644 --- a/src/gdcmElValSet.cxx +++ b/src/gdcmElValSet.cxx @@ -65,8 +65,6 @@ void gdcmElValSet::Print(std::ostream & os) { std::string d2; gdcmTS * ts = gdcmGlobal::GetTS(); - std::cout << "------------- using tagHt ---------------------" << std::endl; - for (TagElValueHT::iterator tag = tagHt.begin(); tag != tagHt.end(); ++tag){ @@ -97,12 +95,10 @@ void gdcmElValSet::Print(std::ostream & os) { os << std::endl; } - std::cout << "------------ using listElem -------------------" << std::endl; - - guint32 lgth; - char greltag[10]; //group element tag + guint32 lgth; + char greltag[10]; //group element tag - for (ListTag::iterator i = listElem.begin(); + for (ListTag::iterator i = listElem.begin(); i != listElem.end(); ++i){ g = (*i)->GetGroup(); @@ -470,8 +466,6 @@ void gdcmElValSet::WriteElements(FileType type, FILE * _fp) { val = tag2->second->GetValue().c_str(); vr = tag2->second->GetVR(); - // std::cout << "Tag "<< std::hex << gr << " " << el << std::endl; - if ( type == ACR ) { if (gr < 0x0008) continue; // ignore pure DICOM V3 groups if (gr %2) continue; // ignore shadow groups diff --git a/src/gdcmFile.cxx b/src/gdcmFile.cxx index 69fba758..fdbef674 100644 --- a/src/gdcmFile.cxx +++ b/src/gdcmFile.cxx @@ -17,25 +17,87 @@ * one sets an a posteriori shadow dictionary (efficiency can be * seen as a side effect). * - * @param filename file to be opened for parsing + * @param header file to be opened for reading datas * * @return */ -gdcmFile::gdcmFile(std::string & filename) - :gdcmHeader(filename.c_str()) +gdcmFile::gdcmFile(gdcmHeader *header) { - if (IsReadable()) - SetPixelDataSizeFromHeader(); + Header=header; + SelfHeader=false; + + if (Header->IsReadable()) + SetPixelDataSizeFromHeader(); } -gdcmFile::gdcmFile(const char * filename) - :gdcmHeader(filename) +///////////////////////////////////////////////////////////////// +/** + * \ingroup gdcmFile + * \brief Constructor dedicated to writing a new DICOMV3 part10 compliant + * file (see SetFileName, SetDcmTag and Write) + * Opens (in read only and when possible) an existing file and checks + * for DICOM compliance. Returns NULL on failure. + * \Note the in-memory representation of all available tags found in + * the DICOM header is post-poned to first header information access. + * This avoid a double parsing of public part of the header when + * one sets an a posteriori shadow dictionary (efficiency can be + * seen as a side effect). + * + * @param filename file to be opened for parsing + * + * @return + */ +gdcmFile::gdcmFile(std::string & filename) +{ + Header=new gdcmHeader(filename.c_str()); + SelfHeader=true; + + if (Header->IsReadable()) + SetPixelDataSizeFromHeader(); +} + +gdcmFile::gdcmFile(const char * filename) { - if (IsReadable()) + Header=new gdcmHeader(filename); + SelfHeader=true; + + if (Header->IsReadable()) SetPixelDataSizeFromHeader(); } +///////////////////////////////////////////////////////////////// +/** + * \ingroup gdcmFile + * \brief Destructor dedicated to writing a new DICOMV3 part10 compliant + * file (see SetFileName, SetDcmTag and Write) + * Opens (in read only and when possible) an existing file and checks + * for DICOM compliance. Returns NULL on failure. + * \Note If the gdcmHeader is created by the gdcmFile, it is destroyed + * by the gdcmFile + * + * @param filename file to be opened for parsing + * + * @return + */ +gdcmFile::~gdcmFile(void) +{ + if(SelfHeader) + delete Header; + Header=NULL; +} + + +/** + * \ingroup gdcmFile + * \brief + * @return + */ +gdcmHeader *gdcmFile::GetHeader(void) +{ + return(Header); +} + /** * \ingroup gdcmFile * \brief calcule la longueur (in bytes) A ALLOUER pour recevoir les @@ -49,22 +111,22 @@ gdcmFile::gdcmFile(const char * filename) void gdcmFile::SetPixelDataSizeFromHeader(void) { int nb; std::string str_nb; - str_nb=gdcmHeader::GetPubElValByNumber(0x0028,0x0100); + str_nb=Header->GetPubElValByNumber(0x0028,0x0100); if (str_nb == GDCM_UNFOUND ) { nb = 16; } else { nb = atoi(str_nb.c_str() ); if (nb == 12) nb =16; } - lgrTotale = lgrTotaleRaw = GetXSize() * GetYSize() * GetZSize() - * (nb/8)* GetSamplesPerPixel(); + lgrTotale = lgrTotaleRaw = Header->GetXSize() * Header->GetYSize() + * Header->GetZSize() * (nb/8)* Header->GetSamplesPerPixel(); std::string str_PhotometricInterpretation = - gdcmHeader::GetPubElValByNumber(0x0028,0x0004); + Header->GetPubElValByNumber(0x0028,0x0004); /*if ( str_PhotometricInterpretation == "PALETTE COLOR " )*/ // pb when undealt Segmented Palette Color - if (HasLUT()) { + if (Header->HasLUT()) { lgrTotale*=3; } } @@ -134,11 +196,13 @@ size_t gdcmFile::GetImageDataSize(void) { */ bool gdcmFile::ReadPixelData(void* destination) { - if ( !OpenFile()) + FILE *fp; + + if ( !(fp=Header->OpenFile())) return false; - if ( fseek(fp, GetPixelOffset(), SEEK_SET) == -1 ) { - CloseFile(); + if ( fseek(fp, Header->GetPixelOffset(), SEEK_SET) == -1 ) { + Header->CloseFile(); return false; } @@ -149,8 +213,8 @@ bool gdcmFile::ReadPixelData(void* destination) { /* 2 pixels 12bit = [0xABCDEF] */ /* 2 pixels 16bit = [0x0ABD] + [0x0FCE] */ - if (GetBitsAllocated()==12) { - int nbPixels = GetXSize()*GetYSize(); + if (Header->GetBitsAllocated()==12) { + int nbPixels = Header->GetXSize() * Header->GetYSize(); unsigned char b0, b1, b2; unsigned short int* pdestination = (unsigned short int*)destination; @@ -171,135 +235,137 @@ bool gdcmFile::ReadPixelData(void* destination) { // ---------------------- Uncompressed File - if ( !IsDicomV3() || - IsImplicitVRLittleEndianTransferSyntax() || - IsExplicitVRLittleEndianTransferSyntax() || - IsExplicitVRBigEndianTransferSyntax() || - IsDeflatedExplicitVRLittleEndianTransferSyntax() ) { + if ( !Header->IsDicomV3() || + Header->IsImplicitVRLittleEndianTransferSyntax() || + Header->IsExplicitVRLittleEndianTransferSyntax() || + Header->IsExplicitVRBigEndianTransferSyntax() || + Header->IsDeflatedExplicitVRLittleEndianTransferSyntax() ) { - size_t ItemRead = fread(destination, GetPixelAreaLength(), 1, fp); + size_t ItemRead = fread(destination, Header->GetPixelAreaLength(), 1, fp); if ( ItemRead != 1 ) { - CloseFile(); + Header->CloseFile(); return false; } else { - CloseFile(); + Header->CloseFile(); return true; } } // ---------------------- Run Length Encoding - if (gdcmHeader::IsRLELossLessTransferSyntax()) { - int res = (bool)gdcm_read_RLE_file (destination); - return res; - } + if (Header->IsRLELossLessTransferSyntax()) { + bool res = (bool)gdcm_read_RLE_file (fp,destination); + return res; + } // --------------- SingleFrame/Multiframe JPEG Lossless/Lossy/2000 - int nb; - std::string str_nb=gdcmHeader::GetPubElValByNumber(0x0028,0x0100); - if (str_nb == GDCM_UNFOUND ) { - nb = 16; - } else { - nb = atoi(str_nb.c_str() ); - if (nb == 12) nb =16; // ?? 12 should be ACR-NEMA only ? - } - int nBytes= nb/8; - - int taille = GetXSize() * GetYSize() * GetSamplesPerPixel(); - long fragmentBegining; // for ftell, fseek - - bool jpg2000 = IsJPEG2000(); - bool jpgLossless = IsJPEGLossless(); - - bool res = true; - guint16 ItemTagGr,ItemTagEl; - int ln; - - // Position on begining of Jpeg Pixels + int nb; + std::string str_nb=Header->GetPubElValByNumber(0x0028,0x0100); + if (str_nb == GDCM_UNFOUND ) { + nb = 16; + } else { + nb = atoi(str_nb.c_str() ); + if (nb == 12) nb =16; // ?? 12 should be ACR-NEMA only ? + } + + int nBytes= nb/8; + + int taille = Header->GetXSize() * Header->GetYSize() + * Header->GetSamplesPerPixel(); + long fragmentBegining; // for ftell, fseek + + bool jpg2000 = Header->IsJPEG2000(); + bool jpgLossless = Header->IsJPEGLossless(); + + bool res = true; + guint16 ItemTagGr,ItemTagEl; + int ln; + + // Position on begining of Jpeg Pixels + + fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr + fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El + if(Header->GetSwapCode()) { + ItemTagGr=Header->SwapShort(ItemTagGr); + ItemTagEl=Header->SwapShort(ItemTagEl); + } + fread(&ln,4,1,fp); + if(Header->GetSwapCode()) + ln=Header->SwapLong(ln); // Basic Offset Table Item length - fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr - fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El - if(GetSwapCode()) { - ItemTagGr=SwapShort(ItemTagGr); - ItemTagEl=SwapShort(ItemTagEl); - } + if (ln != 0) { + // What is it used for ?!? + char *BasicOffsetTableItemValue = (char *)malloc(ln+1); + fread(BasicOffsetTableItemValue,ln,1,fp); + } + + // first Fragment initialisation + fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr + fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El + if(Header->GetSwapCode()) { + ItemTagGr=Header->SwapShort(ItemTagGr); + ItemTagEl=Header->SwapShort(ItemTagEl); + } + + // parsing fragments until Sequence Delim. Tag found + + while ( ( ItemTagGr == 0xfffe) && (ItemTagEl != 0xe0dd) ) { + // --- for each Fragment + fread(&ln,4,1,fp); - if(GetSwapCode()) - ln=SwapLong(ln); // Basic Offset Table Item length - - if (ln != 0) { - // What is it used for ?!? - char *BasicOffsetTableItemValue = (char *)malloc(ln+1); - fread(BasicOffsetTableItemValue,ln,1,fp); - } - - // first Fragment initialisation - fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr - fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El - if(GetSwapCode()) { - ItemTagGr=SwapShort(ItemTagGr); - ItemTagEl=SwapShort(ItemTagEl); - } - - // parsing fragments until Sequence Delim. Tag found - - while ( ( ItemTagGr == 0xfffe) && (ItemTagEl != 0xe0dd) ) { - - // --- for each Fragment - - fread(&ln,4,1,fp); - if(GetSwapCode()) - ln=SwapLong(ln); // Fragment Item length - - fragmentBegining=ftell(fp); + if(Header->GetSwapCode()) + ln=Header->SwapLong(ln); // Fragment Item length + + fragmentBegining=ftell(fp); + + if (jpg2000) { // JPEG 2000 : call to ??? - if (jpg2000) { // JPEG 2000 : call to ??? - - res = (bool)gdcm_read_JPEG2000_file (destination); // Not Yet written + res = (bool)gdcm_read_JPEG2000_file (fp,destination); // Not Yet written - } // ------------------------------------- endif (JPEG2000) - - else if (jpgLossless) { // JPEG LossLess : call to xmedcom JPEG - - JPEGLosslessDecodeImage (fp, // Reading Fragment pixels + } // ------------------------------------- endif (JPEG2000) + + else if (jpgLossless) { // JPEG LossLess : call to xmedcom JPEG + + JPEGLosslessDecodeImage (fp, // Reading Fragment pixels (unsigned short *)destination, - GetPixelSize()*8* GetSamplesPerPixel(), + Header->GetPixelSize()*8* Header->GetSamplesPerPixel(), ln); - res=1; // in order not to break the loop - - } // ------------------------------------- endif (JPEGLossless) - - else { // JPEG Lossy : call to IJG 6b - - if (GetBitsStored() == 8) { - res = (bool)gdcm_read_JPEG_file (destination); // Reading Fragment pixels - } else { - res = (bool)gdcm_read_JPEG_file12 (destination);// Reading Fragment pixels - } - } // ------------------------------------- endif (JPEGLossy) - - if (!res) break; - - destination = (char *)destination + taille * nBytes; // location in user's memory - // for next fragment (if any) - - fseek(fp,fragmentBegining,SEEK_SET); // To be sure we start - fseek(fp,ln,SEEK_CUR); // at the begining of next fragment - - ItemTagGr = ItemTagEl =0; - fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr - fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El - if(GetSwapCode()) { - ItemTagGr=SwapShort(ItemTagGr); - ItemTagEl=SwapShort(ItemTagEl); + res=1; // in order not to break the loop + + } // ------------------------------------- endif (JPEGLossless) + + else { // JPEG Lossy : call to IJG 6b + + if (Header->GetBitsStored() == 8) { + res = (bool)gdcm_read_JPEG_file (fp,destination); // Reading Fragment pixels + } else { + res = (bool)gdcm_read_JPEG_file12 (fp,destination);// Reading Fragment pixels } + } // ------------------------------------- endif (JPEGLossy) + + if (!res) break; + + destination = (char *)destination + taille * nBytes; // location in user's memory + // for next fragment (if any) - } // endWhile parsing fragments until Sequence Delim. Tag found - - return res; -} + fseek(fp,fragmentBegining,SEEK_SET); // To be sure we start + fseek(fp,ln,SEEK_CUR); // at the begining of next fragment + + ItemTagGr = ItemTagEl =0; + fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr + fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El + if(Header->GetSwapCode()) { + ItemTagGr=Header->SwapShort(ItemTagGr); + ItemTagEl=Header->SwapShort(ItemTagEl); + } + + } // endWhile parsing fragments until Sequence Delim. Tag found + + Header->CloseFile(); + return res; +} /** * \ingroup gdcmFile @@ -329,7 +395,7 @@ void * gdcmFile::GetImageData (void) { * \ NULL if alloc fails */ void * gdcmFile::GetImageDataRaw (void) { - if (HasLUT()) + if (Header->HasLUT()) lgrTotale /= 3; // TODO Let gdcmHeadar user a chance // to get the right value // Create a member lgrTotaleRaw ??? @@ -365,14 +431,14 @@ size_t gdcmFile::GetImageDataIntoVector (void* destination, size_t MaxSize) { size_t l = GetImageDataIntoVectorRaw (destination, MaxSize); - if (!HasLUT()) + if (!Header->HasLUT()) return lgrTotale; // from Lut R + Lut G + Lut B unsigned char * newDest = (unsigned char *)malloc(lgrTotale); unsigned char * a = (unsigned char *)destination; - unsigned char * lutRGBA = GetLUTRGBA(); + unsigned char * lutRGBA = Header->GetLUTRGBA(); if (lutRGBA) { int l = lgrTotaleRaw; memmove(newDest, destination, l);// move Gray pixels to temp area @@ -391,11 +457,11 @@ size_t gdcmFile::GetImageDataIntoVector (void* destination, size_t MaxSize) { // CreateOrReplaceIfExist ? std::string spp = "3"; // Samples Per Pixel - gdcmHeader::SetPubElValByNumber(spp,0x0028,0x0002); + Header->SetPubElValByNumber(spp,0x0028,0x0002); std::string rgb= "RGB "; // Photometric Interpretation - gdcmHeader::SetPubElValByNumber(rgb,0x0028,0x0004); + Header->SetPubElValByNumber(rgb,0x0028,0x0004); std::string planConfig = "0"; // Planar Configuration - gdcmHeader::SetPubElValByNumber(planConfig,0x0028,0x0006); + Header->SetPubElValByNumber(planConfig,0x0028,0x0006); } else { @@ -412,7 +478,7 @@ size_t gdcmFile::GetImageDataIntoVector (void* destination, size_t MaxSize) { // Segmented xxx Palette Color are *more* than 65535 long ?!? std::string rgb= "MONOCHROME1 "; // Photometric Interpretation - gdcmHeader::SetPubElValByNumber(rgb,0x0028,0x0004); + Header->SetPubElValByNumber(rgb,0x0028,0x0004); } @@ -461,7 +527,7 @@ size_t gdcmFile::GetImageDataIntoVectorRaw (void* destination, size_t MaxSize) { (void)ReadPixelData(destination); // Nombre de Bits Alloues pour le stockage d'un Pixel - str_nb = GetPubElValByNumber(0x0028,0x0100); + str_nb = Header->GetPubElValByNumber(0x0028,0x0100); if (str_nb == GDCM_UNFOUND ) { nb = 16; } else { @@ -469,7 +535,7 @@ size_t gdcmFile::GetImageDataIntoVectorRaw (void* destination, size_t MaxSize) { } // Nombre de Bits Utilises - str_nbu=GetPubElValByNumber(0x0028,0x0101); + str_nbu=Header->GetPubElValByNumber(0x0028,0x0101); if (str_nbu == GDCM_UNFOUND ) { nbu = nb; } else { @@ -477,7 +543,7 @@ size_t gdcmFile::GetImageDataIntoVectorRaw (void* destination, size_t MaxSize) { } // Position du Bit de Poids Fort - str_highBit=GetPubElValByNumber(0x0028,0x0102); + str_highBit=Header->GetPubElValByNumber(0x0028,0x0102); if (str_highBit == GDCM_UNFOUND ) { highBit = nb - 1; } else { @@ -486,7 +552,7 @@ size_t gdcmFile::GetImageDataIntoVectorRaw (void* destination, size_t MaxSize) { // Pixel sign // 0 = Unsigned // 1 = Signed - str_signe=GetPubElValByNumber(0x0028,0x0103); + str_signe=Header->GetPubElValByNumber(0x0028,0x0103); if (str_signe == GDCM_UNFOUND ) { signe = 0; // default is unsigned } else { @@ -495,7 +561,7 @@ size_t gdcmFile::GetImageDataIntoVectorRaw (void* destination, size_t MaxSize) { // re arange bytes inside the integer if (nb != 8) - SwapZone(destination, GetSwapCode(), lgrTotale, nb); + SwapZone(destination, Header->GetSwapCode(), lgrTotale, nb); // to avoid pb with some xmedcon breakers images if (nb==16 && nbuGetPubElValByNumber(0x0028,0x0004); if ( (str_PhotometricInterpretation == "MONOCHROME1 ") || (str_PhotometricInterpretation == "MONOCHROME2 ") ) { @@ -560,7 +626,7 @@ size_t gdcmFile::GetImageDataIntoVectorRaw (void* destination, size_t MaxSize) { // PhotometricInterpretation=PALETTE COLOR // and heuristic has to be found :-( - int planConf=GetPlanarConfiguration(); // 0028,0006 + int planConf=Header->GetPlanarConfiguration(); // 0028,0006 // Whatever Planar Configuration is, // "PALETTE COLOR " implies that we deal with the palette. @@ -587,8 +653,8 @@ size_t gdcmFile::GetImageDataIntoVectorRaw (void* destination, size_t MaxSize) { // ftp://medical.nema.org/medical/dicom/final/sup61_ft.pdf // and be *very* affraid // - int l = GetXSize()*GetYSize(); - int nbFrames = GetZSize(); + int l = Header->GetXSize()*Header->GetYSize(); + int nbFrames = Header->GetZSize(); unsigned char * newDest = (unsigned char*) malloc(lgrTotale); unsigned char *x = newDest; @@ -627,7 +693,7 @@ size_t gdcmFile::GetImageDataIntoVectorRaw (void* destination, size_t MaxSize) { // need to make RGB Pixels from R,G,B Planes // (all the Frames at a time) - int l = GetXSize()*GetYSize()*GetZSize(); + int l = Header->GetXSize()*Header->GetYSize()*Header->GetZSize(); char * newDest = (char*) malloc(lgrTotale); char * x = newDest; @@ -661,12 +727,12 @@ size_t gdcmFile::GetImageDataIntoVectorRaw (void* destination, size_t MaxSize) { std::string spp = "3"; // Samples Per Pixel - gdcmHeader::SetPubElValByNumber(spp,0x0028,0x0002); + Header->SetPubElValByNumber(spp,0x0028,0x0002); std::string rgb="RGB "; // Photometric Interpretation - gdcmHeader::SetPubElValByNumber(rgb,0x0028,0x0004); + Header->SetPubElValByNumber(rgb,0x0028,0x0004); std::string planConfig = "0"; // Planar Configuration - gdcmHeader::SetPubElValByNumber(planConfig,0x0028,0x0006); + Header->SetPubElValByNumber(planConfig,0x0028,0x0006); // TODO : Drop Palette Color out of the Header? @@ -767,42 +833,13 @@ return; * @return integer acts as a boolean */ int gdcmFile::SetImageData(void * inData, size_t ExpectedSize) { - SetImageDataSize(ExpectedSize); + Header->SetImageDataSize(ExpectedSize); PixelData = inData; lgrTotale = ExpectedSize; return(1); } -///////////////////////////////////////////////////////////////// -/** - * \ingroup gdcmFile - * \brief Sets the Pixel Area size in the Header - * --> not-for-rats function - * - * \warning WARNING doit-etre etre publique ? - * TODO : y aurait il un inconvenient à fusionner ces 2 fonctions - * - * @param ImageDataSize new Pixel Area Size - * warning : nothing else is checked - */ - -void gdcmFile::SetImageDataSize(size_t ImageDataSize) { - std::string content1; - char car[20]; - // Assumes ElValue (0x7fe0, 0x0010) exists ... - sprintf(car,"%d",ImageDataSize); - - gdcmElValue*a = GetElValueByNumber(0x7fe0, 0x0010); - a->SetLength(ImageDataSize); - - ImageDataSize+=8; - sprintf(car,"%d",ImageDataSize); - content1=car; - SetPubElValByNumber(content1, 0x7fe0, 0x0000); -} - - ///////////////////////////////////////////////////////////////// /** * \ingroup gdcmFile @@ -921,15 +958,15 @@ int gdcmFile::WriteBase (std::string FileName, FileType type) { // just before writting ... std::string rows, columns; - if ( filetype == ACR_LIBIDO){ - rows = GetPubElValByNumber(0x0028, 0x0010); - columns = GetPubElValByNumber(0x0028, 0x0011); - SetPubElValByNumber(columns, 0x0028, 0x0010); - SetPubElValByNumber(rows , 0x0028, 0x0011); + if ( Header->GetFileType() == ACR_LIBIDO){ + rows = Header->GetPubElValByNumber(0x0028, 0x0010); + columns = Header->GetPubElValByNumber(0x0028, 0x0011); + Header->SetPubElValByNumber(columns, 0x0028, 0x0010); + Header->SetPubElValByNumber(rows , 0x0028, 0x0011); } // ----------------- End of Special Patch ---------------- - gdcmHeader::Write(fp1, type); + Header->Write(fp1, type); // -------------------------------------------------------------- // Special Patch to allow gdcm to re-write ACR-LibIDO formated images @@ -937,9 +974,9 @@ int gdcmFile::WriteBase (std::string FileName, FileType type) { // ...and we restore the Header to be Dicom Compliant again // just after writting - if (filetype == ACR_LIBIDO){ - SetPubElValByNumber(rows , 0x0028, 0x0010); - SetPubElValByNumber(columns, 0x0028, 0x0011); + if (Header->GetFileType() == ACR_LIBIDO){ + Header->SetPubElValByNumber(rows , 0x0028, 0x0010); + Header->SetPubElValByNumber(columns, 0x0028, 0x0011); } // ----------------- End of Special Patch ---------------- diff --git a/src/gdcmFile.h b/src/gdcmFile.h index caed93e6..9fc32bae 100644 --- a/src/gdcmFile.h +++ b/src/gdcmFile.h @@ -11,9 +11,12 @@ // for accessing the image/volume content. One can also use it to // write Dicom files. -class GDCM_EXPORT gdcmFile: public gdcmHeader +class GDCM_EXPORT gdcmFile { private: + gdcmHeader *Header; // Header to use to load the file + bool SelfHeader; + void* PixelData; size_t lgrTotaleRaw; // Area length to receive the pixels size_t lgrTotale; // Area length to receive the RGB pixels @@ -25,20 +28,25 @@ private: bool ReadPixelData(void * destination); - int gdcm_read_JPEG_file (void * image_buffer); // For JPEG 8 Bits - int gdcm_read_JPEG_file12 (void * image_buffer); // For JPEG 12 Bits - int gdcm_read_JPEG2000_file (void * image_buffer); // For JPEG 2000 (TODO) + bool gdcm_read_JPEG_file (FILE *fp,void * image_buffer); // For JPEG 8 Bits + bool gdcm_read_JPEG_file12 (FILE *fp,void * image_buffer); // For JPEG 12 Bits + bool gdcm_read_JPEG2000_file (FILE *fp,void * image_buffer); // For JPEG 2000 (TODO) // For Run Length Encoding (TOCHECK) - int gdcm_read_RLE_file (void * image_buffer); + bool gdcm_read_RLE_file (FILE *fp,void * image_buffer); protected: int WriteBase(std::string FileName, FileType type); + public: + gdcmFile(gdcmHeader *header); gdcmFile(std::string & filename); gdcmFile(const char * filename); + virtual ~gdcmFile(void); + gdcmHeader *GetHeader(void); + // For promotion (performs a deepcopy of pointed header object) // TODO Swig gdcmFile(gdcmHeader* header); // TODO Swig ~gdcmFile(); @@ -64,7 +72,6 @@ public: int SetImageData (void * Data, size_t ExpectedSize); // When the caller is aware we simply point to the data: // TODO int SetImageDataNoCopy (void * Data, size_t ExpectedSize); - void SetImageDataSize (size_t ExpectedSize); // Push to disk. // A NE PAS OUBLIER : que fait-on en cas de Transfert Syntax (dans l'entete) diff --git a/src/gdcmHeader.cxx b/src/gdcmHeader.cxx index c394fd2b..85756a3b 100644 --- a/src/gdcmHeader.cxx +++ b/src/gdcmHeader.cxx @@ -1,4 +1,4 @@ -// $Header: /cvs/public/gdcm/src/Attic/gdcmHeader.cxx,v 1.120 2003/11/18 09:23:16 malaterre Exp $ +// $Header: /cvs/public/gdcm/src/Attic/gdcmHeader.cxx,v 1.121 2003/12/22 12:46:16 regrain Exp $ #include "gdcmHeader.h" @@ -47,7 +47,7 @@ void gdcmHeader::Initialise(void) { */ gdcmHeader::gdcmHeader(const char *InFilename, bool exception_on_error, - bool enable_sequences ) { + bool enable_sequences ) { if (enable_sequences) enableSequences = 1; else @@ -79,7 +79,7 @@ gdcmHeader::gdcmHeader(bool exception_on_error) { * @param exception_on_error * @return */ - bool gdcmHeader::OpenFile(bool exception_on_error) +FILE *gdcmHeader::OpenFile(bool exception_on_error) throw(gdcmFileError) { fp=fopen(filename.c_str(),"rb"); if(exception_on_error) { @@ -93,20 +93,22 @@ gdcmHeader::gdcmHeader(bool exception_on_error) { //ACR -- or DICOM with no Preamble if( zero == 0x0008 || zero == 0x0800 || zero == 0x0002 || zero == 0x0200) - return true; + return(fp); + //DICOM fseek(fp, 126L, SEEK_CUR); char dicm[4]; fread(dicm, (size_t)4, (size_t)1, fp); if( memcmp(dicm, "DICM", 4) == 0 ) - return true; + return(fp); + fclose(fp); dbg.Verbose(0, "gdcmHeader::gdcmHeader not DICOM/ACR", filename.c_str()); } else { dbg.Verbose(0, "gdcmHeader::gdcmHeader cannot open file", filename.c_str()); } - return false; + return(NULL); } /** @@ -746,7 +748,7 @@ void gdcmHeader::FixFoundLength(gdcmElValue * ElVal, guint32 FoundLength) { std::string vr = ElVal->GetVR(); guint16 length16; if( (element == 0x0010) && (group == 0x7fe0) ) { - dbg.SetDebug(0); + dbg.SetDebug(-1); dbg.Verbose(2, "gdcmHeader::FindLength: ", "we reached 7fe0 0010"); } @@ -1730,6 +1732,16 @@ void gdcmHeader::ParseHeader(bool exception_on_error) throw(gdcmFormatError) { } } +/** + * \ingroup gdcmHeader + * \brief + * @return + */ +FileType gdcmHeader::GetFileType(void) +{ + return(filetype); +} + /** * \ingroup gdcmHeader * \brief This predicate, based on hopefully reasonable heuristics, @@ -1912,16 +1924,12 @@ void * gdcmHeader::LoadElementVoidArea(guint16 Group, guint16 Elem) { int l=Element->GetLength(); void * a = malloc(l); if(!a) { - std::cout << "Big Broblem (LoadElementVoidArea, malloc) " - << std::hex << Group << " " << Elem << std::endl; return NULL; } /* int res = */ PubElValSet.SetVoidAreaByNumber(a, Group, Elem); // TODO check the result size_t l2 = fread(a, 1, l ,fp); if(l != l2) { - std::cout << "Big Broblem (LoadElementVoidArea, fread) " - << std::hex << Group << " " << Elem << std::endl; free(a); return NULL; } @@ -2143,8 +2151,6 @@ std::string gdcmHeader::GetPixelType(void) { if (Signed == "0") Signed = std::string("U"); else - -std::cout << "GetPixelType : " << BitsAlloc + Signed << std::endl; Signed = std::string("S"); return( BitsAlloc + Signed); @@ -2369,3 +2375,32 @@ unsigned char * gdcmHeader::GetLUTRGBA(void) { return(LUTRGBA); } +///////////////////////////////////////////////////////////////// +/** + * \ingroup gdcmFile + * \brief Sets the Pixel Area size in the Header + * --> not-for-rats function + * + * \warning WARNING doit-etre etre publique ? + * TODO : y aurait il un inconvenient à fusionner ces 2 fonctions + * + * @param ImageDataSize new Pixel Area Size + * warning : nothing else is checked + */ + +void gdcmHeader::SetImageDataSize(size_t ImageDataSize) { + std::string content1; + char car[20]; + // Assumes ElValue (0x7fe0, 0x0010) exists ... + sprintf(car,"%d",ImageDataSize); + + gdcmElValue *a = GetElValueByNumber(0x7fe0, 0x0010); + a->SetLength(ImageDataSize); + + ImageDataSize+=8; + sprintf(car,"%d",ImageDataSize); + content1=car; + SetPubElValByNumber(content1, 0x7fe0, 0x0000); +} + + diff --git a/src/gdcmHeader.h b/src/gdcmHeader.h index 9d704b5a..01caad0b 100644 --- a/src/gdcmHeader.h +++ b/src/gdcmHeader.h @@ -1,4 +1,4 @@ -// $Header: /cvs/public/gdcm/src/Attic/gdcmHeader.h,v 1.44 2003/11/13 10:23:40 malaterre Exp $ +// $Header: /cvs/public/gdcm/src/Attic/gdcmHeader.h,v 1.45 2003/12/22 12:46:16 regrain Exp $ #ifndef GDCMHEADER_H #define GDCMHEADER_H @@ -34,7 +34,6 @@ typedef std::map VRHT; // Value Representation Hash Table /// gdcmFile and gdcmHeader. class GDCM_EXPORT gdcmHeader { - void SkipBytes(guint32); private: /// Pointer to the Value Representation Hash Table which contains all /// the VR of the DICOM version3 public dictionary. @@ -58,7 +57,7 @@ private: std::string filename; int enableSequences; - + // FIXME sw should be an enum e.g. //enum EndianType { //LittleEndian, @@ -82,42 +81,44 @@ private: void CheckSwap(void); void SwitchSwapToBigEndian(void); // CLEAN ME: NewManualElValToPubDict is NOT called any more. - gdcmElValue* NewManualElValToPubDict(std::string NewTagName, + gdcmElValue *NewManualElValToPubDict(std::string NewTagName, std::string VR); void SetMaxSizeLoadElementValue(long); - gdcmDictEntry * GetDictEntryByNumber(guint16, guint16); - gdcmDictEntry * GetDictEntryByName (std::string Name); + gdcmDictEntry *GetDictEntryByNumber(guint16, guint16); + gdcmDictEntry *GetDictEntryByName (std::string Name); // ElValue related utilities - gdcmElValue * ReadNextElement(void); - gdcmElValue * NewElValueByNumber(guint16 group, guint16 element); - gdcmElValue * NewElValueByName (std::string Name); + gdcmElValue *ReadNextElement(void); + gdcmElValue *NewElValueByNumber(guint16 group, guint16 element); + gdcmElValue *NewElValueByName (std::string Name); void FindLength (gdcmElValue *); void FindVR (gdcmElValue *); void LoadElementValue (gdcmElValue *); void LoadElementValueSafe(gdcmElValue *); void SkipElementValue (gdcmElValue *); - void FixFoundLength (gdcmElValue*, guint32); + void FixFoundLength (gdcmElValue *, guint32); bool IsAnInteger (gdcmElValue *); void LoadElements(void); - + void SkipBytes(guint32); + protected: - FILE * fp; FileType filetype; - + FILE * fp; + gdcmElValue * GetElValueByNumber(guint16 group, guint16 element); int CheckIfExistByNumber(guint16 Group, guint16 Elem ); - guint16 SwapShort(guint16); // needed by gdcmFile - guint32 SwapLong(guint32); // for JPEG Files :-( - bool OpenFile(bool exception_on_error = false) - throw(gdcmFileError); - bool CloseFile(void); int write(std::ostream&); int anonymize(std::ostream&); // FIXME : anonymize should be a friend ? + public: + FILE *OpenFile(bool exception_on_error = false) + throw(gdcmFileError); + bool CloseFile(void); + FileType GetFileType(void); + bool IsReadable(void); bool IsImplicitVRLittleEndianTransferSyntax(void); bool IsExplicitVRLittleEndianTransferSyntax(void); @@ -135,10 +136,10 @@ public: virtual void ParseHeader(bool exception_on_error = false) throw(gdcmFormatError); - gdcmHeader( bool exception_on_error = false); + gdcmHeader(bool exception_on_error = false); gdcmHeader(const char *filename, bool exception_on_error = false, - bool enable_sequences = false); + bool enable_sequences = false); virtual ~gdcmHeader(); @@ -213,7 +214,11 @@ public: int GetLUTNbits(void); unsigned char * GetLUTRGBA(void); + void SetImageDataSize (size_t ExpectedSize); +// System access + guint16 SwapShort(guint16); // needed by gdcmFile + guint32 SwapLong(guint32); // for JPEG Files }; #endif diff --git a/src/gdcmHeaderHelper.h b/src/gdcmHeaderHelper.h index 0c94396c..204a7864 100644 --- a/src/gdcmHeaderHelper.h +++ b/src/gdcmHeaderHelper.h @@ -1,12 +1,9 @@ -// $Header: /cvs/public/gdcm/src/Attic/gdcmHeaderHelper.h,v 1.7 2003/11/12 14:06:35 malaterre Exp $ +// $Header: /cvs/public/gdcm/src/Attic/gdcmHeaderHelper.h,v 1.8 2003/12/22 12:46:16 regrain Exp $ #ifndef GDCMHEADERHELPER_H #define GDCMHEADERHELPER_H #include "gdcmHeader.h" -//#include -//#include -//#include // Dicom Part 3.3 Compliant enum ModalityType { @@ -66,7 +63,6 @@ class GDCM_EXPORT gdcmHeaderHelper : public gdcmHeader { public: - gdcmHeaderHelper::gdcmHeaderHelper(); gdcmHeaderHelper::gdcmHeaderHelper(const char *filename, bool exception_on_error = false); diff --git a/src/gdcmJpeg.cxx b/src/gdcmJpeg.cxx index c4d3db4c..76f04c23 100644 --- a/src/gdcmJpeg.cxx +++ b/src/gdcmJpeg.cxx @@ -146,11 +146,8 @@ my_error_exit (j_common_ptr cinfo) { * Sample routine for JPEG decompression. We assume that the source file name * is passed in. We want to return 1 on success, 0 on error. */ - - -//GLOBAL(int) -int -gdcmFile::gdcm_read_JPEG_file (void * image_buffer) { +//GLOBAL(bool) +bool gdcmFile::gdcm_read_JPEG_file (FILE *fp,void * image_buffer) { char *pimage; diff --git a/src/gdcmJpeg12.cxx b/src/gdcmJpeg12.cxx index 1d21f4b2..8a9a4bd8 100644 --- a/src/gdcmJpeg12.cxx +++ b/src/gdcmJpeg12.cxx @@ -163,9 +163,8 @@ my_error_exit (j_common_ptr cinfo) { */ -//GLOBAL(int) -int -gdcmFile::gdcm_read_JPEG_file12 (void * image_buffer) { +//GLOBAL(bool) +bool gdcmFile::gdcm_read_JPEG_file12 (FILE *fp,void * image_buffer) { char *pimage; @@ -227,7 +226,7 @@ char *pimage; * We need to clean up the JPEG object, close the input file, and return. */ jpeg_destroy_decompress(&cinfo); - return 0; + return(false); } /* Now we can initialize the JPEG decompression object. */ jpeg_create_decompress(&cinfo); @@ -258,6 +257,7 @@ if (DEBUG) { cinfo.output_components); printf("nb of color components returned %d \n", cinfo.data_precision); + } @@ -366,7 +366,7 @@ if (DEBUG) printf("Entree Step 8\n"); /* And we're done! */ - return 1; + return(true); } /* diff --git a/src/gdcmJpeg2000.cxx b/src/gdcmJpeg2000.cxx index d8505c26..895c865b 100644 --- a/src/gdcmJpeg2000.cxx +++ b/src/gdcmJpeg2000.cxx @@ -8,12 +8,9 @@ #include #include "gdcmFile.h" -int -gdcmFile::gdcm_read_JPEG2000_file (void * image_buffer) { - - +bool gdcmFile::gdcm_read_JPEG2000_file (FILE *fp,void * image_buffer) { printf("Sorry JPEG 2000 File not yet taken into account\n"); - return 0; + return false; } diff --git a/src/gdcmParse.cxx b/src/gdcmParse.cxx index 5a54e8b4..9902db4e 100644 --- a/src/gdcmParse.cxx +++ b/src/gdcmParse.cxx @@ -29,26 +29,28 @@ */ bool gdcmFile::ParsePixelData(void) { - if ( !OpenFile()) + FILE *fp; + + if ( !(fp=Header->OpenFile())) return false; - if ( fseek(fp, GetPixelOffset(), SEEK_SET) == -1 ) { - CloseFile(); + if ( fseek(fp, Header->GetPixelOffset(), SEEK_SET) == -1 ) { + Header->CloseFile(); return false; } - if ( !IsDicomV3() || - IsImplicitVRLittleEndianTransferSyntax() || - IsExplicitVRLittleEndianTransferSyntax() || - IsExplicitVRBigEndianTransferSyntax() || - IsDeflatedExplicitVRLittleEndianTransferSyntax() ) { + if ( !Header->IsDicomV3() || + Header->IsImplicitVRLittleEndianTransferSyntax() || + Header->IsExplicitVRLittleEndianTransferSyntax() || + Header->IsExplicitVRBigEndianTransferSyntax() || + Header->IsDeflatedExplicitVRLittleEndianTransferSyntax() ) { printf ("gdcmFile::ParsePixelData : non JPEG/RLE File\n"); return 0; } int nb; - std::string str_nb=gdcmHeader::GetPubElValByNumber(0x0028,0x0100); + std::string str_nb=Header->GetPubElValByNumber(0x0028,0x0100); if (str_nb == GDCM_UNFOUND ) { nb = 16; } else { @@ -57,7 +59,7 @@ bool gdcmFile::ParsePixelData(void) { } int nBytes= nb/8; - int taille = GetXSize() * GetYSize() * GetSamplesPerPixel(); + int taille = Header->GetXSize() * Header->GetYSize() * Header->GetSamplesPerPixel(); printf ("Checking the Dicom-encapsulated Jpeg/RLE Pixels\n"); @@ -68,24 +70,22 @@ bool gdcmFile::ParsePixelData(void) { // -------------------- for Parsing : Position on begining of Jpeg/RLE Pixels - if( !IsRLELossLessTransferSyntax()) { + if( !Header->IsRLELossLessTransferSyntax()) { // JPEG Image - - std::cout << "JPEG image" << std::endl; ftellRes=ftell(fp); fread(&ItemTagGr,2,1,fp); //Reading (fffe):Basic Offset Table Item Tag Gr fread(&ItemTagEl,2,1,fp); //Reading (e000):Basic Offset Table Item Tag El - if(GetSwapCode()) { - ItemTagGr=SwapShort(ItemTagGr); - ItemTagEl=SwapShort(ItemTagEl); + if(Header->GetSwapCode()) { + ItemTagGr=Header->SwapShort(ItemTagGr); + ItemTagEl=Header->SwapShort(ItemTagEl); } printf ("at %x : ItemTag (should be fffe,e000): %04x,%04x\n", ftellRes,ItemTagGr,ItemTagEl ); ftellRes=ftell(fp); fread(&ln,4,1,fp); - if(GetSwapCode()) - ln=SwapLong(ln); // Basic Offset Table Item Lentgh + if(Header->GetSwapCode()) + ln=Header->SwapLong(ln); // Basic Offset Table Item Lentgh printf("at %x : Basic Offset Table Item Lentgh (??) %d x(%08x)\n", ftellRes,ln,ln); if (ln != 0) { @@ -102,9 +102,9 @@ bool gdcmFile::ParsePixelData(void) { ftellRes=ftell(fp); fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El - if(GetSwapCode()) { - ItemTagGr=SwapShort(ItemTagGr); - ItemTagEl=SwapShort(ItemTagEl); + if(Header->GetSwapCode()) { + ItemTagGr=Header->SwapShort(ItemTagGr); + ItemTagEl=Header->SwapShort(ItemTagEl); } printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n", ftellRes,ItemTagGr,ItemTagEl ); @@ -113,8 +113,8 @@ bool gdcmFile::ParsePixelData(void) { ftellRes=ftell(fp); fread(&ln,4,1,fp); - if(GetSwapCode()) - ln=SwapLong(ln); // length + if(Header->GetSwapCode()) + ln=Header->SwapLong(ln); // length printf(" at %x : fragment length %d x(%08x)\n", ftellRes, ln,ln); @@ -129,9 +129,9 @@ bool gdcmFile::ParsePixelData(void) { ftellRes=ftell(fp); fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El - if(GetSwapCode()) { - ItemTagGr=SwapShort(ItemTagGr); - ItemTagEl=SwapShort(ItemTagEl); + if(Header->GetSwapCode()) { + ItemTagGr=Header->SwapShort(ItemTagGr); + ItemTagEl=Header->SwapShort(ItemTagEl); } printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n", ftellRes,ItemTagGr,ItemTagEl ); @@ -140,8 +140,6 @@ bool gdcmFile::ParsePixelData(void) { } else { // RLE Image - - std::cout << "RLE image" << std::endl; long RleSegmentLength[15],fragmentLength; guint32 nbRleSegments; guint32 RleSegmentOffsetTable[15]; @@ -150,17 +148,17 @@ bool gdcmFile::ParsePixelData(void) { // Item Tag fread(&ItemTagGr,2,1,fp); //Reading (fffe):Basic Offset Table Item Tag Gr fread(&ItemTagEl,2,1,fp); //Reading (e000):Basic Offset Table Item Tag El - if(GetSwapCode()) { - ItemTagGr=SwapShort(ItemTagGr); - ItemTagEl=SwapShort(ItemTagEl); + if(Header->GetSwapCode()) { + ItemTagGr=Header->SwapShort(ItemTagGr); + ItemTagEl=Header->SwapShort(ItemTagEl); } printf ("at %x : ItemTag (should be fffe,e000): %04x,%04x\n", ftellRes,ItemTagGr,ItemTagEl ); // Item Length ftellRes=ftell(fp); fread(&ln,4,1,fp); - if(GetSwapCode()) - ln=SwapLong(ln); // Basic Offset Table Item Lentgh + if(Header->GetSwapCode()) + ln=Header->SwapLong(ln); // Basic Offset Table Item Lentgh printf("at %x : Basic Offset Table Item Lentgh (??) %d x(%08x)\n", ftellRes,ln,ln); if (ln != 0) { @@ -177,9 +175,9 @@ bool gdcmFile::ParsePixelData(void) { ftellRes=ftell(fp); fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El - if(GetSwapCode()) { - ItemTagGr=SwapShort(ItemTagGr); - ItemTagEl=SwapShort(ItemTagEl); + if(Header->GetSwapCode()) { + ItemTagGr=Header->SwapShort(ItemTagGr); + ItemTagEl=Header->SwapShort(ItemTagEl); } printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n", ftellRes,ItemTagGr,ItemTagEl ); @@ -189,23 +187,23 @@ bool gdcmFile::ParsePixelData(void) { // Parse fragments of the current Fragment (Frame) ftellRes=ftell(fp); fread(&fragmentLength,4,1,fp); - if(GetSwapCode()) - fragmentLength=SwapLong(fragmentLength); // length + if(Header->GetSwapCode()) + fragmentLength=Header->SwapLong(fragmentLength); // length printf(" at %x : 'fragment' length %d x(%08x)\n", ftellRes, fragmentLength,fragmentLength); //------------------ scanning (not reading) fragment pixels fread(&nbRleSegments,4,1,fp); // Reading : Number of RLE Segments - if(GetSwapCode()) - nbRleSegments=SwapLong(nbRleSegments); + if(Header->GetSwapCode()) + nbRleSegments=Header->SwapLong(nbRleSegments); printf(" Nb of RLE Segments : %d\n",nbRleSegments); for(int k=1; k<=15; k++) { // Reading RLE Segments Offset Table ftellRes=ftell(fp); fread(&RleSegmentOffsetTable[k],4,1,fp); - if(GetSwapCode()) - RleSegmentOffsetTable[k]=SwapLong(RleSegmentOffsetTable[k]); + if(Header->GetSwapCode()) + RleSegmentOffsetTable[k]=Header->SwapLong(RleSegmentOffsetTable[k]); printf(" at : %x Offset Segment %d : %d (%x)\n", ftellRes,k,RleSegmentOffsetTable[k], RleSegmentOffsetTable[k]); @@ -235,9 +233,9 @@ bool gdcmFile::ParsePixelData(void) { ftellRes=ftell(fp); fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El - if(GetSwapCode()) { - ItemTagGr=SwapShort(ItemTagGr); - ItemTagEl=SwapShort(ItemTagEl); + if(Header->GetSwapCode()) { + ItemTagGr=Header->SwapShort(ItemTagGr); + ItemTagEl=Header->SwapShort(ItemTagEl); } printf ("at %x : ItemTag (should be fffe,e000 or e0dd): %04x,%04x\n", ftellRes,ItemTagGr,ItemTagEl ); diff --git a/src/gdcmRLE.cxx b/src/gdcmRLE.cxx index bb993d48..33986e46 100644 --- a/src/gdcmRLE.cxx +++ b/src/gdcmRLE.cxx @@ -28,8 +28,7 @@ static int _gdcm_read_RLE_fragment (char ** image_buffer, // pb with RLE 16 Bits : -int -gdcmFile::gdcm_read_RLE_file (void * image_buffer) { +bool gdcmFile::gdcm_read_RLE_file (FILE *fp,void * image_buffer) { long fragmentBegining; // for ftell, fseek char * im = (char *)image_buffer; @@ -38,21 +37,21 @@ gdcmFile::gdcm_read_RLE_file (void * image_buffer) { guint32 nbRleSegments; guint32 RleSegmentOffsetTable[15]; guint16 ItemTagGr,ItemTagEl; - uncompressedSegmentSize=GetXSize()*GetYSize(); + uncompressedSegmentSize=Header->GetXSize()*Header->GetYSize(); ftellRes=ftell(fp); // Basic Offset Table with Item Value // Item Tag fread(&ItemTagGr,2,1,fp); // Reading (fffe):Basic Offset Table Item Tag Gr fread(&ItemTagEl,2,1,fp); // Reading (e000):Basic Offset Table Item Tag El - if(GetSwapCode()) { - ItemTagGr=SwapShort(ItemTagGr); - ItemTagEl=SwapShort(ItemTagEl); + if(Header->GetSwapCode()) { + ItemTagGr=Header->SwapShort(ItemTagGr); + ItemTagEl=Header->SwapShort(ItemTagEl); } // Item Length ftellRes=ftell(fp); fread(&ln,4,1,fp); - if(GetSwapCode()) - ln=SwapLong(ln); // Basic Offset Table Item Lentgh + if(Header->GetSwapCode()) + ln=Header->SwapLong(ln); // Basic Offset Table Item Lentgh if (ln != 0) { // What is it used for ?? char * BasicOffsetTableItemValue= (char *)malloc(ln+1); @@ -66,9 +65,9 @@ gdcmFile::gdcm_read_RLE_file (void * image_buffer) { ftellRes=ftell(fp); fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El - if(GetSwapCode()) { - ItemTagGr=SwapShort(ItemTagGr); - ItemTagEl=SwapShort(ItemTagEl); + if(Header->GetSwapCode()) { + ItemTagGr=Header->SwapShort(ItemTagGr); + ItemTagEl=Header->SwapShort(ItemTagEl); } // while 'Sequence Delimiter Item' (fffe,e0dd) not found @@ -76,20 +75,20 @@ gdcmFile::gdcm_read_RLE_file (void * image_buffer) { // Parse fragments of the current Fragment (Frame) ftellRes=ftell(fp); fread(&fragmentLength,4,1,fp); - if(GetSwapCode()) - fragmentLength=SwapLong(fragmentLength); // length + if(Header->GetSwapCode()) + fragmentLength=Header->SwapLong(fragmentLength); // length //------------------ scanning (not reading) fragment pixels fread(&nbRleSegments,4,1,fp); // Reading : Number of RLE Segments - if(GetSwapCode()) - nbRleSegments=SwapLong(nbRleSegments); + if(Header->GetSwapCode()) + nbRleSegments=Header->SwapLong(nbRleSegments); for(int k=1; k<=15; k++) { // Reading RLE Segments Offset Table ftellRes=ftell(fp); fread(&RleSegmentOffsetTable[k],4,1,fp); - if(GetSwapCode()) - RleSegmentOffsetTable[k]=SwapLong(RleSegmentOffsetTable[k]); + if(Header->GetSwapCode()) + RleSegmentOffsetTable[k]=Header->SwapLong(RleSegmentOffsetTable[k]); } if (nbRleSegments>1) { @@ -114,19 +113,19 @@ gdcmFile::gdcm_read_RLE_file (void * image_buffer) { ftellRes=ftell(fp); fread(&ItemTagGr,2,1,fp); // Reading (fffe) : Item Tag Gr fread(&ItemTagEl,2,1,fp); // Reading (e000) : Item Tag El - if(GetSwapCode()) { - ItemTagGr=SwapShort(ItemTagGr); - ItemTagEl=SwapShort(ItemTagEl); + if(Header->GetSwapCode()) { + ItemTagGr=Header->SwapShort(ItemTagGr); + ItemTagEl=Header->SwapShort(ItemTagEl); } } - if (GetBitsAllocated()==16) { // try to deal with RLE 16 Bits + if (Header->GetBitsAllocated()==16) { // try to deal with RLE 16 Bits im = (char *)image_buffer; // need to make 16 Bits Pixels from Low Byte and Hight Byte 'Planes' - int l = GetXSize()*GetYSize(); - int nbFrames = GetZSize(); + int l = Header->GetXSize()*Header->GetYSize(); + int nbFrames = Header->GetZSize(); char * newDest = (char*) malloc(l*nbFrames*2); char *x = newDest; @@ -143,7 +142,7 @@ gdcmFile::gdcm_read_RLE_file (void * image_buffer) { free(newDest); } - return (1); + return(true); } diff --git a/src/win32/gdcmdll.dsp b/src/win32/gdcmdll.dsp index febe3eb8..50de66e6 100644 --- a/src/win32/gdcmdll.dsp +++ b/src/win32/gdcmdll.dsp @@ -58,7 +58,7 @@ LINK32=link.exe # Begin Special Build Tool SOURCE="$(InputPath)" PostBuild_Desc=Copy for test -PostBuild_Cmds=copy ..\..\lib\gdcmdll.dll ..\..\gdcmPython\ copy ..\..\lib\gdcmdll.dll ..\..\test\ copy Release\gdcmdll.lib ..\..\lib\ +PostBuild_Cmds=copy ..\..\lib\gdcmdll.dll ..\..\gdcmPython\ copy ..\..\lib\gdcmdll.dll ..\..\test\ copy Release\gdcmdll.lib ..\..\lib\ # End Special Build Tool !ELSEIF "$(CFG)" == "gdcmdll - Win32 Debug" @@ -85,12 +85,12 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib msvcrtd.lib msvcprtd.lib Wsock32.lib /nologo /dll /debug /machine:I386 /nodefaultlib /out:"..\..\lib\gdcmdll.dll" /pdbtype:sept -# SUBTRACT LINK32 /incremental:no +# ADD LINK32 kernel32.lib msvcrtd.lib msvcprtd.lib Wsock32.lib /nologo /dll /machine:I386 /nodefaultlib /out:"..\..\lib\gdcmdll.dll" /pdbtype:sept +# SUBTRACT LINK32 /incremental:no /debug # Begin Special Build Tool SOURCE="$(InputPath)" PostBuild_Desc=Copy for test -PostBuild_Cmds=copy ..\..\lib\gdcmdll.dll ..\..\gdcmPython\ copy ..\..\lib\gdcmdll.dll ..\..\test\ copy Debug\gdcmdll.lib ..\..\lib\ +PostBuild_Cmds=copy ..\..\lib\gdcmdll.dll ..\..\gdcmPython\ copy ..\..\lib\gdcmdll.dll ..\..\test\ copy Debug\gdcmdll.lib ..\..\lib\ # End Special Build Tool !ENDIF diff --git a/vtk/testvtkGdcmReader.cxx b/vtk/testvtkGdcmReader.cxx index 72d0e3e7..4e5ac8a9 100644 --- a/vtk/testvtkGdcmReader.cxx +++ b/vtk/testvtkGdcmReader.cxx @@ -1,4 +1,4 @@ -// $Header: /cvs/public/gdcm/vtk/Attic/testvtkGdcmReader.cxx,v 1.6 2003/09/30 14:07:20 malaterre Exp $ +// $Header: /cvs/public/gdcm/vtk/Attic/testvtkGdcmReader.cxx,v 1.7 2003/12/22 12:46:19 regrain Exp $ #include #include @@ -30,7 +30,7 @@ int main( int argc, char *argv[] ) // Lecture de l'image vtkGdcmReader *reader = vtkGdcmReader::New(); - reader->DebugOn(); +// reader->DebugOn(); // Alloc Used High // 8 8 7 U : OK // reader->SetFileName("../gdcmData/CT-MONO2-8-abdo.dcm"); diff --git a/vtk/vtkGdcmReader.cxx b/vtk/vtkGdcmReader.cxx index b9aa0732..1e0852bd 100644 --- a/vtk/vtkGdcmReader.cxx +++ b/vtk/vtkGdcmReader.cxx @@ -1,4 +1,4 @@ -// $Header: /cvs/public/gdcm/vtk/vtkGdcmReader.cxx,v 1.28 2003/11/13 10:23:41 malaterre Exp $ +// $Header: /cvs/public/gdcm/vtk/vtkGdcmReader.cxx,v 1.29 2003/12/22 12:46:19 regrain Exp $ // ////////////////////////////////////////////////////////////// // WARNING TODO CLENAME // Actual limitations of this code: @@ -471,17 +471,17 @@ size_t vtkGdcmReader::LoadImageInMemory( // But vtk chooses to invert the lines of an image, that is the last // line comes first (for some axis related reasons?). Hence we need // to load the image line by line, starting from the end. - int NumColumns = GdcmFile.GetXSize(); - int NumLines = GdcmFile.GetYSize(); - int NumPlanes = GdcmFile.GetZSize(); - int LineSize = NumComponents * NumColumns * GdcmFile.GetPixelSize(); + int NumColumns = GdcmFile.GetHeader()->GetXSize(); + int NumLines = GdcmFile.GetHeader()->GetYSize(); + int NumPlanes = GdcmFile.GetHeader()->GetZSize(); + int LineSize = NumComponents * NumColumns * GdcmFile.GetHeader()->GetPixelSize(); unsigned char * Source; - if( GdcmFile.HasLUT() ) + if( GdcmFile.GetHeader()->HasLUT() ) { size = GdcmFile.GetImageDataSizeRaw(); Source = (unsigned char*) GdcmFile.GetImageDataRaw(); - unsigned char *Lut = GdcmFile.GetLUTRGBA(); + unsigned char *Lut = GdcmFile.GetHeader()->GetLUTRGBA(); if(!this->LookupTable) this->LookupTable = vtkLookupTable::New(); this->LookupTable->SetNumberOfTableValues(256); -- 2.48.1