+ int sizeX; // Size X of the image
+ int sizeY; // Size Y of the image
+ int sizeZ; // Size Z of the image
+ int components; // Number of components for a pixel
+ int componentSize; // Component size (in bits : 8, 16) // Bits Allocated
+ int componentUse ; // Component size (in bits) // Bits Stored
+ int sign; // Sign of components
+ char writeMode; // Write mode
+ // - 'a' : ACR
+ // - 'e' : Explicit VR
+ // - 'i' : Implicit VR
+} Image;
+
+Image Images [] = {
+// these ones are use to check further oddities.
+
+ {63, 127, 1, 1, 16, 8, 0 ,'e'},
+ {63, 127, 1, 1, 16, 9, 0 ,'e'},
+ {63, 127, 1, 1, 16, 10, 0 ,'e'},
+ {63, 127, 1, 1, 16, 11, 0 ,'e'},
+ {63, 127, 1, 1, 16, 12, 0 ,'e'},
+ {63, 127, 1, 1, 16, 13, 0 ,'e'},
+ {63, 127, 1, 1, 16, 14, 0 ,'e'},
+ {63, 127, 1, 1, 16, 15, 0 ,'e'},
+ {63, 127, 1, 1, 16, 16, 0 ,'e'},
+
+ {128, 128, 1, 1, 8, 8, 0, 'e'},
+ {256, 128, 1, 1, 8, 8, 0, 'a'},
+ {128, 128, 1, 1, 8, 8, 0, 'i'},
+
+ {128, 128, 1, 1, 8, 8, 0, 'a'},
+ {256, 128, 1, 1, 8, 8, 0, 'i'},
+
+
+ {256, 128, 1, 1, 8, 8, 0, 'e'},
+ {128, 128, 1, 1, 16, 16, 0, 'e'},
+ {128, 256, 1, 1, 16, 16, 0, 'e'},
+
+ {128, 256, 1, 1, 8, 8, 0, 'e'},
+ {128, 256, 1, 1, 8, 8, 0, 'i'},
+ {128, 256, 1, 1, 8, 8, 0, 'a'},
+
+ {128, 256, 1, 1, 16, 16, 0, 'i'},
+ {128, 256, 1, 1, 16, 16, 0, 'i'},
+ {128, 256, 1, 1, 16, 16, 0, 'a'},
+ {128, 256, 1, 1, 16, 16, 0, 'a'},
+
+ {256, 128, 10, 1, 8, 8, 0, 'e'},
+ {256, 128, 10, 3, 8, 8, 0, 'e'},
+ {256, 128, 10, 3, 8, 8, 0, 'i'},
+ {256, 128, 10, 1, 8, 8, 0, 'i'},
+ {256, 128, 10, 1, 8, 8, 0, 'a'},
+ {256, 128, 10, 3, 8, 8, 0, 'a'},
+
+ {128, 128, 1, 1, 8, 8, 1, 'e'},
+ {128, 128, 1, 1, 8, 8, 1, 'i'},
+ {128, 128, 1, 1, 8, 8, 1, 'a'},
+
+ {256, 128, 1, 1, 8, 8, 1, 'e'},
+ {256, 128, 1, 1, 8, 8, 1, 'i'},
+ {256, 128, 1, 1, 8, 8, 1, 'a'},
+
+ {128, 256, 1, 1, 8, 8, 1, 'a'},
+ {128, 256, 1, 1, 8, 8, 1, 'e'},
+ {128, 256, 1, 1, 8, 8, 1, 'i'},
+
+ {128, 256, 1, 1, 16, 16, 1, 'e'},
+ {128, 256, 1, 1, 16, 16, 1, 'e'},
+ {128, 256, 1, 1, 16, 16, 1, 'i'},
+ {128, 256, 1, 1, 16, 16, 1, 'i'},
+ {128, 256, 1, 1, 16, 16, 1, 'a'},
+ {128, 256, 1, 1, 16, 16, 1, 'a'},
+
+ {256, 128, 10, 1, 8, 8, 1, 'e'},
+ {256, 128, 10, 1, 8, 8, 1, 'i'},
+ {256, 128, 10, 1, 8, 8, 1, 'a'},
+
+ {256, 128, 10, 3, 8, 8, 1, 'e'},
+ {256, 128, 10, 3, 8, 8, 1, 'i'},
+ {256, 128, 10, 3, 8, 8, 1, 'a'},
+ {0, 0, 1, 1, 8, 8, 0, 'i'} // to find the end
+};
+
+
+const unsigned int MAX_NUMBER_OF_DIFFERENCE = 10;
+
+int WriteSimple(Image &img)
+{
+
+ std::cout << "======================= WriteSimple =========(begin of processing current image)" << std::endl;
+ std::ostringstream fileName;
+ fileName.str("");
+ fileName << "TestWriteSimple";
+
+// Step 1 : Create an empty FileHelper
+
+ std::cout << " 1...";
+ GDCM_NAME_SPACE::FileHelper *fileH = GDCM_NAME_SPACE::FileHelper::New();
+
+ // Get the (empty) image header.
+ GDCM_NAME_SPACE::File *fileToBuild = fileH->GetFile();
+ std::ostringstream str;
+
+ // Set the image size
+ str.str("");
+ str << img.sizeX;
+ fileToBuild->InsertEntryString(str.str(),0x0028,0x0011,"US"); // Columns
+ str.str("");
+ str << img.sizeY;
+ fileToBuild->InsertEntryString(str.str(),0x0028,0x0010,"US"); // Rows
+
+ if(img.sizeZ>1)
+ {
+ str.str("");
+ str << img.sizeZ;
+ fileToBuild->InsertEntryString(str.str(),0x0028,0x0008, "IS"); // Number of Frames
+ }
+
+ fileName << "-" << img.sizeX << "-" << img.sizeY << "-" << img.sizeZ;
+
+ // Set the pixel type
+ str.str("");
+ str << img.componentSize;
+ fileToBuild->InsertEntryString(str.str(),0x0028,0x0100,"US"); // Bits Allocated
+
+ str.str("");
+ str << img.componentUse;
+ fileToBuild->InsertEntryString(str.str(),0x0028,0x0101,"US"); // Bits Stored
+
+ str.str("");
+ str << ( img.componentUse - 1 );
+ fileToBuild->InsertEntryString(str.str(),0x0028,0x0102,"US"); // High Bit
+
+ // Set the pixel representation
+ str.str("");
+ str << img.sign;
+ fileToBuild->InsertEntryString(str.str(),0x0028,0x0103,"US"); // Pixel Representation
+
+ fileName << "-" << img.componentSize;
+ if(img.sign == 0)
+ fileName << "U";
+ else
+ fileName << "S";
+
+ fileName << "-" << img.componentSize << "-" << img.componentUse;
+
+ fileToBuild->InsertEntryString("0",0x0008,0x0000,"UL"); // Should be removed
+ // except for ACR
+ switch (img.writeMode)
+ {
+ case 'a' :
+ fileName << ".ACR";
+ break;
+ case 'e' :
+ fileName << ".EXPL";
+ break;
+ case 'i' :
+ fileName << ".IMPL";
+ break;
+ }
+
+ std::cout << "[" << fileName.str() << "]...";
+ // Set the samples per pixel
+ str.str("");
+ str << img.components;
+ fileToBuild->InsertEntryString(str.str(),0x0028,0x0002,"US"); // Samples per Pixel
+
+// Step 2 : Create the output image
+ std::cout << "2...";
+ if( img.componentSize%8 > 0 )
+ {
+ img.componentSize += 8-img.componentSize%8;
+ }
+ size_t size = img.sizeX * img.sizeY * img.sizeZ
+ * img.components * img.componentSize / 8;
+ unsigned char *imageData = new unsigned char[size];
+
+ // FIXME : find a better heuristic to create the image
+ unsigned char *tmp = imageData;
+ for(int k=0;k<img.sizeZ;k++)
+ {
+ for(int j=0;j<img.sizeY;j++)
+ {
+ for(int i=0;i<img.sizeX;i++)
+ {
+ for(int c=0;c<img.components;c++)
+ {
+ *tmp = (unsigned char)(j%256);
+ if( img.componentSize>8 )
+ {
+ *(tmp+1) = (unsigned char)(j/256);
+ }
+ tmp += img.componentSize/8;
+ }
+ }
+ }
+ }