#include "gdcmUtil.h"
#include "jpeg/ljpg/jpegless.h"
+typedef std::pair<TagHeaderEntryHT::iterator,TagHeaderEntryHT::iterator> IterHT;
+
//-----------------------------------------------------------------------------
// Constructor / Destructor
/**
gdcmFile::gdcmFile(gdcmHeader *header) {
Header=header;
SelfHeader=false;
+ PixelRead=-1; // no ImageData read yet.
if (Header->IsReadable())
SetPixelDataSizeFromHeader();
gdcmFile::gdcmFile(std::string & filename) {
Header=new gdcmHeader(filename.c_str());
SelfHeader=true;
+ PixelRead=-1; // no ImageData read yet.
if (Header->IsReadable())
SetPixelDataSizeFromHeader();
gdcmFile::gdcmFile(const char * filename) {
Header=new gdcmHeader(filename);
SelfHeader=true;
+ PixelRead=-1; // no ImageData read yet.
if (Header->IsReadable())
SetPixelDataSizeFromHeader();
PixelData = (void *) malloc(lgrTotale);
if (PixelData)
GetImageDataIntoVector(PixelData, lgrTotale);
+ PixelRead=0; // no PixelRaw
return(PixelData);
}
*/
size_t gdcmFile::GetImageDataIntoVector (void* destination, size_t MaxSize) {
size_t l = GetImageDataIntoVectorRaw (destination, MaxSize);
-
+ PixelRead=0 ; // no PixelRaw
if (!Header->HasLUT())
return lgrTotale;
PixelData = (void *) malloc(lgrTotale);
if (PixelData)
GetImageDataIntoVectorRaw(PixelData, lgrTotale);
+ PixelRead=1; // PixelRaw
return(PixelData);
}
int nb, nbu, highBit, signe;
std::string str_nbFrames, str_nb, str_nbu, str_highBit, str_signe;
+ PixelRead=1 ; // PixelRaw
if ( lgrTotale > MaxSize ) {
dbg.Verbose(0, "gdcmFile::GetImageDataIntoVector: pixel data bigger"
}
(void)ReadPixelData(destination);
-
+
// Number of Bits Allocated for storing a Pixel
str_nb = Header->GetEntryByNumber(0x0028,0x0100);
if (str_nb == GDCM_UNFOUND ) {
// DO NOT remove this code commented out.
// Nobody knows what's expecting you ...
// Just to 'see' what was actually read on disk :-(
+
// FILE * f2;
-// f2 = fopen("SpuriousFile.raw","wb");
+// f2 = fopen("SpuriousFile.RAW","wb");
// fwrite(destination,lgrTotale,1,f2);
// fclose(f2);
/**
* \ingroup gdcmFile
- * \brief Ecrit sur disque les pixels d'UNE image
- * Aucun test n'est fait sur l'"Endiannerie" du processeur.
+ * \brief Writes on disk A SINGLE Dicom file
+ * NO test is performed on processor "Endiannity".
* Ca sera à l'utilisateur d'appeler son Reader correctement
* (Equivalent a IdImaWriteRawFile)
*
FILE * fp1;
fp1 = fopen(fileName.c_str(),"wb");
if (fp1 == NULL) {
- printf("Echec ouverture (ecriture) Fichier [%s] \n",fileName.c_str());
+ printf("Fail to open (write) file [%s] \n",fileName.c_str());
return (false);
}
fwrite (PixelData,lgrTotale, 1, fp1);
/**
* \ingroup gdcmFile
- * \brief Ecrit sur disque UNE image Dicom
- * Aucun test n'est fait sur l'"Endiannerie" du processeur.
- * Ca fonctionnera correctement (?) sur processeur Intel
- * (Equivalent a IdDcmWrite)
+ * \brief Writes on disk A SINGLE Dicom file
+ * NO test is performed on processor "Endiannity".
*
* @param fileName name of the file to be created
* (any already existing file is overwritten)
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("Echec ouverture (ecriture) Fichier [%s] \n",fileName.c_str());
+ printf("Failed to open (write) File [%s] \n",fileName.c_str());
return (false);
}
filePreamble=(char*)calloc(128,1);
fwrite(filePreamble,128,1,fp1);
fwrite("DICM",4,1,fp1);
+ free (filePreamble);
}
// --------------------------------------------------------------
// 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){
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);
// --------------------------------------------------------------
Header->SetEntryByNumber(columns, 0x0028, 0x0011);
}
// ----------------- End of Special Patch ----------------
-
+
fwrite(PixelData, lgrTotale, 1, fp1);
fclose (fp1);
return(true);
if ( !(fp=Header->OpenFile()))
return false;
-
if ( fseek(fp, Header->GetPixelOffset(), SEEK_SET) == -1 ) {
Header->CloseFile();
return false;
}
-
-
// ---------------------- Compacted File (12 Bits Per Pixel)
/* unpack 12 Bits pixels into 16 Bits pixels */
/* 2 pixels 12bit = [0xABCDEF] */
/* 2 pixels 16bit = [0x0ABD] + [0x0FCE] */
+
if (Header->GetBitsAllocated()==12) {
int nbPixels = Header->GetXSize() * Header->GetYSize();
unsigned char b0, b1, b2;