+ int pixelSize = fh->GetFile()->GetPixelSize();
+ size_t lgrSubLine = subImDimX* pixelSize * numberOfScalarComponents;
+ size_t lgrSubFrame = subImDimY*lgrSubLine;
+ ;
+ int lgrSubImage = (end-beg+1) * lgrSubFrame;
+
+ uint8_t * subImage = new uint8_t[lgrSubImage];
+
+ uint8_t * srcCopy = (uint8_t *) imageData;
+ uint8_t * destCopy = subImage;
+ int lineSize = nX*pixelSize*numberOfScalarComponents;
+ int frameSize = nY*lineSize;
+
+ int lineOffset = roiBoundVal[0]*pixelSize * numberOfScalarComponents;
+
+ for (int frameNb=beg, frameCount=0; frameNb<=end; frameNb++, frameCount++)
+ {
+ for (int lineNb=roiBoundVal[2], lineCount=0; lineNb<=roiBoundVal[3]; lineNb++, lineCount++)
+ {
+ /// \todo increment data pointer, don't multiply so much!
+ memcpy( (void *)(destCopy + frameCount*lgrSubFrame + lineCount*lgrSubLine),
+ (void *)(srcCopy + frameNb*frameSize + lineNb*lineSize + lineOffset ),
+ lgrSubLine);
+ }
+ }
+
+ // Set the image size
+ str.str("");
+ str << subImDimX ;
+ fh->InsertEntryString(str.str(),0x0028,0x0011,"US"); // Columns
+
+ str.str("");
+ str << subImDimY;
+ fh->InsertEntryString(str.str(),0x0028,0x0010,"US"); // Rows
+ str.str("");
+ str << end-beg+1;
+ fh->InsertEntryString(str.str(),0x0028,0x0008, "IS"); // Number of Frames
+
+ fh->SetImageData(subImage,lgrSubImage);
+
+ }
+
+
+//----------------------------------- Write, now! ---------------------------------
+
+ switch (mode[0])
+ {
+ case 'A' :
+ case 'a' :
+ // Writting an ACR file
+ // from a full gdcm readable File
+ std::cout << "WriteACR" << std::endl;
+ fh->WriteAcr(outputFileName);
+ break;
+
+ case 'D' : // Not documented in the 'usage', because the method
+ case 'd' : // is known to be bugged.
+ // Writting a DICOM Implicit VR file
+ // from a full gdcm readable File
+ std::cout << "WriteDCM Implicit VR" << std::endl;
+ fh->WriteDcmImplVR(outputFileName);
+ break;
+
+ case 'X' :
+ case 'x' :
+ // writting a DICOM Explicit VR
+ // from a full gdcm readable File
+ std::cout << "WriteDCM Explicit VR" << std::endl;
+ // fh->WriteDcmExplVR(outputFileName);
+ // Try this one :
+ fh->SetWriteTypeToDcmExplVR();
+ fh->Write(outputFileName);
+ break;
+
+ case 'R' :
+ case 'r' :
+ // Writting a Raw File,
+ std::cout << "WriteRaw" << std::endl;
+ fh->WriteRawData(outputFileName);
+ break;
+
+ // Just for fun :
+ // Write a 'Video inverse' version of the file.
+ // *Not* described, on purpose, in the USAGE
+ case 'V' :
+ case 'v' :
+ if ( fh->GetFile()->GetBitsAllocated() == 8)
+ {
+ std::cout << "videoinv for 8 bits" << std::endl;
+ for (int i=0; i<dataSize; i++)
+ {
+ ((uint8_t*)imageData)[i] = 255 - ((uint8_t*)imageData)[i];
+ }
+ }
+ else
+ {
+ std::cout << "videoinv for 16 bits" << std::endl;
+ for (int i=0; i<dataSize/2; i++)
+ {
+ ((uint16_t*)imageData)[i] = 65535 - ((uint16_t*)imageData)[i];
+ }
+ }
+ std::cout << "WriteDCM Explicit VR + VideoInv" << std::endl;
+ fh->WriteDcmExplVR(outputFileName);
+ break;