+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
["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:
####################################
["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"],
["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"],
["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"],
["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.
["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"],
["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:
####################################
["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"],
["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"],
["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.
["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",
["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:
####################################
# 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
["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 = [
["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
["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
["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
["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"],
["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 = [
["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", ""] ] ],
["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.
["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"],
["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
["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)
["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)
["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.
["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 = [
["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"],
["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]
# 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
# 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):
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)
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)"
std::string d2;
gdcmTS * ts = gdcmGlobal::GetTS();
- std::cout << "------------- using tagHt ---------------------" << std::endl;
-
for (TagElValueHT::iterator tag = tagHt.begin();
tag != tagHt.end();
++tag){
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();
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
* 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
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;
}
}
*/
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;
}
/* 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;
// ---------------------- 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
* \ 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 ???
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
// 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 {
// 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);
}
(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 {
}
// Nombre de Bits Utilises
- str_nbu=GetPubElValByNumber(0x0028,0x0101);
+ str_nbu=Header->GetPubElValByNumber(0x0028,0x0101);
if (str_nbu == GDCM_UNFOUND ) {
nbu = nb;
} else {
}
// 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 {
// 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 {
// 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 && nbu<nb && signe==0) {
// -------------------
std::string str_PhotometricInterpretation =
- gdcmHeader::GetPubElValByNumber(0x0028,0x0004);
+ Header->GetPubElValByNumber(0x0028,0x0004);
if ( (str_PhotometricInterpretation == "MONOCHROME1 ")
|| (str_PhotometricInterpretation == "MONOCHROME2 ") ) {
// 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.
// 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;
// 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;
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?
* @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
// 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
// ...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 ----------------
// 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
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();
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)
-// $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"
*/
gdcmHeader::gdcmHeader(const char *InFilename,
bool exception_on_error,
- bool enable_sequences ) {
+ bool enable_sequences ) {
if (enable_sequences)
enableSequences = 1;
else
* @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) {
//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);
}
/**
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");
}
}
}
+/**
+ * \ingroup gdcmHeader
+ * \brief
+ * @return
+ */
+FileType gdcmHeader::GetFileType(void)
+{
+ return(filetype);
+}
+
/**
* \ingroup gdcmHeader
* \brief This predicate, based on hopefully reasonable heuristics,
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;
}
if (Signed == "0")
Signed = std::string("U");
else
-
-std::cout << "GetPixelType : " << BitsAlloc + Signed << std::endl;
Signed = std::string("S");
return( BitsAlloc + Signed);
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);
+}
+
+
-// $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
/// 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.
std::string filename;
int enableSequences;
-
+
// FIXME sw should be an enum e.g.
//enum EndianType {
//LittleEndian,
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);
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();
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
-// $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 <list>
-//#include <string>
-//#include <vector>
// Dicom Part 3.3 Compliant
enum ModalityType {
class GDCM_EXPORT gdcmHeaderHelper : public gdcmHeader {
public:
-
gdcmHeaderHelper::gdcmHeaderHelper();
gdcmHeaderHelper::gdcmHeaderHelper(const char *filename, bool exception_on_error = false);
* 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;
*/
-//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;
* 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);
cinfo.output_components);
printf("nb of color components returned %d \n",
cinfo.data_precision);
+
}
/* And we're done! */
- return 1;
+ return(true);
}
/*
#include <stdio.h>
#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;
}
*/
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 {
}
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");
// -------------------- 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) {
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 );
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);
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 );
} else {
// RLE Image
-
- std::cout << "RLE image" << std::endl;
long RleSegmentLength[15],fragmentLength;
guint32 nbRleSegments;
guint32 RleSegmentOffsetTable[15];
// 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) {
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 );
// 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]);
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 );
// 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;
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);
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
// 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) {
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;
free(newDest);
}
- return (1);
+ return(true);
}
# Begin Special Build Tool\r
SOURCE="$(InputPath)"\r
PostBuild_Desc=Copy for test\r
-PostBuild_Cmds=copy ..\..\lib\gdcmdll.dll ..\..\gdcmPython\ copy ..\..\lib\gdcmdll.dll ..\..\test\ copy Release\gdcmdll.lib ..\..\lib\ \r
+PostBuild_Cmds=copy ..\..\lib\gdcmdll.dll ..\..\gdcmPython\ copy ..\..\lib\gdcmdll.dll ..\..\test\ copy Release\gdcmdll.lib ..\..\lib\ \r
# End Special Build Tool\r
\r
!ELSEIF "$(CFG)" == "gdcmdll - Win32 Debug"\r
# ADD BSC32 /nologo\r
LINK32=link.exe\r
# 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\r
-# ADD LINK32 kernel32.lib msvcrtd.lib msvcprtd.lib Wsock32.lib /nologo /dll /debug /machine:I386 /nodefaultlib /out:"..\..\lib\gdcmdll.dll" /pdbtype:sept\r
-# SUBTRACT LINK32 /incremental:no\r
+# ADD LINK32 kernel32.lib msvcrtd.lib msvcprtd.lib Wsock32.lib /nologo /dll /machine:I386 /nodefaultlib /out:"..\..\lib\gdcmdll.dll" /pdbtype:sept\r
+# SUBTRACT LINK32 /incremental:no /debug\r
# Begin Special Build Tool\r
SOURCE="$(InputPath)"\r
PostBuild_Desc=Copy for test\r
-PostBuild_Cmds=copy ..\..\lib\gdcmdll.dll ..\..\gdcmPython\ copy ..\..\lib\gdcmdll.dll ..\..\test\ copy Debug\gdcmdll.lib ..\..\lib\ \r
+PostBuild_Cmds=copy ..\..\lib\gdcmdll.dll ..\..\gdcmPython\ copy ..\..\lib\gdcmdll.dll ..\..\test\ copy Debug\gdcmdll.lib ..\..\lib\ \r
# End Special Build Tool\r
\r
!ENDIF \r
-// $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 <vtkRenderer.h>
#include <vtkRenderWindow.h>
// 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");
-// $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:
// 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);