+/**
+ * \ingroup gdcmFile
+ * \brief Writes on disk A SINGLE Dicom file,
+ * using the Implicit Value Representation convention
+ * NO test is performed on processor "Endiannity".
+ * @param fileName name of the file to be created
+ * (any already existing file is overwritten)
+ * @return false if write fails
+ */
+
+bool gdcmFile::WriteDcmImplVR (std::string fileName) {
+ return WriteBase(fileName, ImplicitVR);
+}
+
+/**
+ * \ingroup gdcmFile
+ * \brief Writes on disk A SINGLE Dicom file,
+ * using the Implicit Value Representation convention
+ * NO test is performed on processor "Endiannity". * @param fileName name of the file to be created
+ * (any already existing file is overwritten)
+ * @return false if write fails
+ */
+
+bool gdcmFile::WriteDcmImplVR (const char* fileName) {
+ return WriteDcmImplVR (std::string (fileName));
+}
+
+/**
+ * \ingroup gdcmFile
+* \brief Writes on disk A SINGLE Dicom file,
+ * using the Explicit Value Representation convention
+ * NO test is performed on processor "Endiannity". * @param fileName name of the file to be created
+ * (any already existing file is overwritten)
+ * @return false if write fails
+ */
+
+bool gdcmFile::WriteDcmExplVR (std::string fileName) {
+ return WriteBase(fileName, ExplicitVR);
+}
+
+/**
+ * \ingroup gdcmFile
+ * \brief Writes on disk A SINGLE Dicom file,
+ * using the ACR-NEMA convention
+ * NO test is performed on processor "Endiannity".
+ * (a l'attention des logiciels cliniques
+ * qui ne prennent en entrée QUE des images ACR ...
+ * \warning if a DICOM_V3 header is supplied,
+ * groups < 0x0008 and shadow groups are ignored
+ * \warning NO TEST is performed on processor "Endiannity".
+ * @param fileName name of the file to be created
+ * (any already existing file is overwritten)
+ * @return false if write fails
+ */
+
+bool gdcmFile::WriteAcr (std::string fileName) {
+ return WriteBase(fileName, ACR);
+}
+
+//-----------------------------------------------------------------------------
+// Protected
+/**
+ * \ingroup gdcmFile
+ * \brief NOT a end user inteded function
+ * (used by WriteDcmExplVR, WriteDcmImplVR, WriteAcr, etc)
+ * @param fileName name of the file to be created
+ * (any already existing file is overwritten)
+ * @param type file type (ExplicitVR, ImplicitVR, DICOMDIR, ...)
+ * @return false if write fails
+ */
+bool gdcmFile::WriteBase (std::string fileName, FileType type) {
+
+ FILE * fp1;
+
+ if (PixelRead==-1 && type != DICOMDIR) {
+/* std::cout << "U never Read the pixels; U cannot write the file"
+ << std::endl;*/
+ return false;
+ }
+
+ fp1 = fopen(fileName.c_str(),"wb");
+ if (fp1 == NULL) {
+ printf("Failed to open (write) File [%s] \n",fileName.c_str());
+ return (false);
+ }
+
+ if ( (type == ImplicitVR) || (type == ExplicitVR) ) {
+ char * filePreamble;
+ // writing Dicom File Preamble
+ filePreamble=(char*)calloc(128,1);
+ fwrite(filePreamble,128,1,fp1);
+ fwrite("DICM",4,1,fp1);
+ free (filePreamble);
+ }
+
+ // --------------------------------------------------------------
+ // Special Patch to allow gdcm to re-write ACR-LibIDO formated images
+ //
+ // if recognition code tells us we dealt with a LibIDO image
+ // we reproduce on disk the switch between lineNumber and columnNumber
+ // just before writting ...
+
+ // TODO : the best trick would be *change* the recognition code
+ // but pb expected if user deals with, e.g. COMPLEX images
+
+ std::string rows, columns;
+ if ( Header->GetFileType() == ACR_LIBIDO){
+ rows = Header->GetEntryByNumber(0x0028, 0x0010);
+ columns = Header->GetEntryByNumber(0x0028, 0x0011);
+ Header->SetEntryByNumber(columns, 0x0028, 0x0010);
+ Header->SetEntryByNumber(rows , 0x0028, 0x0011);
+ }
+ // ----------------- End of Special Patch ----------------
+
+ // TODO : get the grPixel, numPixel values (for some ACR-NEMA images only)
+
+ guint16 grPixel =Header->GetGrPixel();
+ guint16 numPixel=Header->GetNumPixel();;
+
+ // Update Pixel Data Length
+ // the *last* of the (GrPixel, NumPixel), if many.
+
+ TagKey key = gdcmDictEntry::TranslateToKey(grPixel, numPixel);
+ TagHeaderEntryHT::iterator p2;
+ gdcmHeaderEntry * PixelElement;
+
+ IterHT it= Header->GetEntry().equal_range(key); // get a pair of iterators first-last synonym
+
+ if (Header->GetEntry().count(key) == 1) // only the first is significant
+ p2=it.first; // iterator on the first (unique) synonym
+ else
+ p2=it.second;// iterator on the last synonym
+
+ PixelElement=p2->second; // H Table target column (2-nd col)
+ // PixelElement->SetPrintLevel(2);
+ // PixelElement->Print();
+
+ if (PixelRead==1)
+ PixelElement->SetLength(lgrTotaleRaw);
+ else if (PixelRead==0)
+ PixelElement->SetLength(lgrTotale);
+
+ //PixelElement->SetPrintLevel(2);
+ //PixelElement->Print();
+
+ 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 (Header->GetFileType() == ACR_LIBIDO){
+ Header->SetEntryByNumber(rows , 0x0028, 0x0010);
+ Header->SetEntryByNumber(columns, 0x0028, 0x0011);
+ }
+ // ----------------- End of Special Patch ----------------
+
+ fwrite(PixelData, lgrTotale, 1, fp1);
+ fclose (fp1);
+ return(true);
+}
+
+//-----------------------------------------------------------------------------
+// Private
+/**
+ * \ingroup gdcmFile
+ * \brief Swap the bytes, according to swap code.
+ * \warning not end user intended
+ * @param im area to deal with
+ * @param swap swap code
+ * @param lgr Area Length
+ * @param nb Pixels Bit number
+ */