+ 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)
+ int componentUse ; // Component size (in bits)
+ int sign; // Sign of components
+ char writeMode; // Write mode
+ // - 'a' : ACR
+ // - 'e' : Explicit VR
+ // - 'i' : Implicit VR
+} Image;
+
+Image Images [] = {
+
+ {128, 128, 1, 1, 8, 8, 0, 'e'},
+ {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, 128, 1, 1, 8, 8, 0, 'i'},
+ {256, 128, 1, 1, 8, 8, 0, 'i'},
+ {256, 128, 1, 1, 8, 8, 0, 'a'},
+ {128, 128, 1, 1, 8, 8, 0, 'a'},
+
+ {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::ostringstream fileName;
+ fileName.str("");
+ fileName << "TestWriteSimple";
+
+// Step 1 : Create an empty FileHelper
+
+ std::cout << " 1...";
+ gdcm::FileHelper *fileH = gdcm::FileHelper::New();
+
+ // Get the (empty) image header.
+ gdcm::File *fileToBuild = fileH->GetFile();
+ std::ostringstream str;
+
+ // Set the image size
+ str.str("");
+ str << img.sizeX;
+ fileToBuild->InsertEntryString(str.str(),0x0028,0x0011); // Columns
+ str.str("");
+ str << img.sizeY;
+ fileToBuild->InsertEntryString(str.str(),0x0028,0x0010); // Rows
+
+ if(img.sizeZ>1)
+ {
+ str.str("");
+ str << img.sizeZ;
+ fileToBuild->InsertEntryString(str.str(),0x0028,0x0008); // 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); // Bits Allocated
+
+ str.str("");
+ str << img.componentUse;
+ fileToBuild->InsertEntryString(str.str(),0x0028,0x0101); // Bits Stored
+
+ str.str("");
+ str << ( img.componentSize - 1 );
+ fileToBuild->InsertEntryString(str.str(),0x0028,0x0102); // High Bit
+
+ // Set the pixel representation
+ str.str("");
+ str << img.sign;
+ fileToBuild->InsertEntryString(str.str(),0x0028,0x0103); // Pixel Representation
+
+ fileName << "-" << img.componentSize;
+ if(img.sign == 0)
+ fileName << "U";
+ else
+ fileName << "S";
+
+ 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); // 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;
+ }
+ }
+ }
+ }
+
+// Step 3 : Set the image Pixel Data
+ std::cout << "3...";
+ fileH->SetImageData(imageData,size);
+
+// Step 4 : Set the writting mode and write the image
+ std::cout << "4...";