Module: $RCSfile: gdcmFileHelper.cxx,v $
Language: C++
- Date: $Date: 2007/07/05 10:53:48 $
- Version: $Revision: 1.116 $
+ Date: $Date: 2007/07/13 08:17:21 $
+ Version: $Revision: 1.117 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
fh->SetImageData( userPixels, userPixelsLength);
fh->SetTypeToRaw(); // Even if it was possible to convert Palette to RGB
// (WriteMode is set)
-
+
+// If user wants to write the file as MONOCHROME1 (0=white)
+fh->SetPhotometricInterpretationToMonochrome1();
+
fh->SetWriteTypeToDcmExpl(); // he wants Explicit Value Representation
// Little Endian is the default
// no other value is allowed
// ----------------------------- WARNING -------------------------
-
These lines will be moved to the document-to-be 'Developer's Guide'
WriteMode : WMODE_RAW / WMODE_RGB
*/
void FileHelper::SetUserData(uint8_t *inData, size_t expectedSize)
{
- PixelWriteConverter->SetUserData(inData, expectedSize);
+ if( WriteType == JPEG2000 )
+ {
+ PixelWriteConverter->SetCompressJPEG2000UserData(inData, expectedSize, FileInternal);
+ }
+ else if( WriteType == JPEG )
+ {
+ PixelWriteConverter->SetCompressJPEGUserData(inData, expectedSize, FileInternal);
+ }
+ else
+ {
+ PixelWriteConverter->SetUserData(inData, expectedSize);
+ }
}
/**
*/
bool FileHelper::Write(std::string const &fileName)
{
-
CheckMandatoryElements(); //called once, here !
bool flag = false;
// Let's just *dream* about it; *never* trust a user !
// We turn to Implicit VR if at least the VR of one element is unknown.
+ /// \TODO : better we put vr=UN for undocumented Shadow Groups !
e = FileInternal->GetFirstEntry();
while (e != 0)
SetWriteFileTypeToJPEG();
break;
- case JPEG2000:
+ case JPEG2000:
SetWriteFileTypeToJPEG2000();
break;
}
}
bool check = CheckWriteIntegrity(); // verifies length
- if (WriteType == JPEG || WriteType == JPEG2000) check = true;
+ if (WriteType == JPEG || WriteType == JPEG2000)
+ check = true;
+
if (check)
{
check = FileInternal->Write(fileName,WriteType);
}
- RestoreWrite();
+ RestoreWrite();
// RestoreWriteFileType();
// RestoreWriteMandatory();
-
// --------------------------------------------------------------
// Special Patch to allow gdcm to re-write ACR-LibIDO formated images
//-----------------------------------------------------------------------------
// Protected
/**
- * \brief * \brief Verifies the size of the user given PixelData
+ * \brief Verifies the size of the user given PixelData
* @return true if check is successfull
*/
bool FileHelper::CheckWriteIntegrity()
break;
}
}
-
return true;
}
if (!FileInternal->HasLUT() && GetPhotometricInterpretation() == 1)
{
- ConvertFixGreyLevels( pixel->GetBinArea(), pixel->GetLength() );
+ ConvertFixGreyLevels( pixel->GetBinArea(), pixel->GetLength() );
}
Archive->Push(photInt);
*/
void FileHelper::RestoreWrite()
{
-
Archive->Restore(0x0028,0x0002);
Archive->Restore(0x0028,0x0004);
Archive->Push(0x0002,0x0102);
}
- /**
- * \brief Sets in the File the TransferSyntax to 'JPEG2000'
- */
+/**
+ * \brief Sets in the File the TransferSyntax to 'JPEG2000'
+ */
void FileHelper::SetWriteFileTypeToJPEG2000()
{
std::string ts = Util::DicomString(
Global::GetTS()->GetSpecialTransferSyntax(TS::JPEG2000Lossless) );
-
+
DataEntry *tss = CopyDataEntry(0x0002,0x0010,"UI");
tss->SetString(ts);
/**
* \brief Sets in the File the TransferSyntax to 'JPEG'
- */
+ */
void FileHelper::SetWriteFileTypeToJPEG()
{
- std::string ts = Util::DicomString(
- Global::GetTS()->GetSpecialTransferSyntax(TS::JPEGBaselineProcess1) );
+ std::string ts = Util::DicomString(
+ Global::GetTS()->GetSpecialTransferSyntax(TS::JPEGLosslessProcess14_1) );
DataEntry *tss = CopyDataEntry(0x0002,0x0010,"UI");
tss->SetString(ts);
if ( oldRow && oldCol )
{
std::string rows, columns;
-
- //DataEntry *newRow=DataEntry::New(oldRow->GetDictEntry());
- //DataEntry *newCol=DataEntry::New(oldCol->GetDictEntry());
DataEntry *newRow=DataEntry::New(0x0028, 0x0010, "US");
DataEntry *newCol=DataEntry::New(0x0028, 0x0011, "US");
if ( oldE )
{
- //newE = DataEntry::New(oldE->GetDictEntry());
newE = DataEntry::New(group, elem, vr);
newE->Copy(oldE);
}
FILTERED_IMAGE
-3) user created a new image, using a set of existing images (eg MIP, MPR, cartography image)
CREATED_IMAGE
--4) user modified/added some tags *without processing* the pixels (anonymization..
+-4) user modified/added some tags *without processing* the pixels (anonymization...)
UNMODIFIED_PIXELS_IMAGE
--Probabely some more to be added
+-Probabely some more to be added.
gdcm::FileHelper::CheckMandatoryElements() deals automatically with these cases.
//0002 0000 UL 1 Meta Group Length
//0002 0001 OB 1 File Meta Information Version
- //0002 0002 UI 1 Media Stored SOP Class UID
- //0002 0003 UI 1 Media Stored SOP Instance UID
+ //0002 0002 UI 1 Media Storage SOP Class UID
+ //0002 0003 UI 1 Media Storage SOP Instance UID
//0002 0010 UI 1 Transfer Syntax UID
//0002 0012 UI 1 Implementation Class UID
//0002 0013 SH 1 Implementation Version Name
//0002 0016 AE 1 Source Application Entity Title
//0002 0100 UI 1 Private Information Creator
//0002 0102 OB 1 Private Information
-
+
// Push out 'ACR-NEMA-special' entries, if any
Archive->Push(0x0008,0x0001); // Length to End
Archive->Push(0x0008,0x0010); // Recognition Code
- Archive->Push(0x0028,0x0005); // Image Dimension
-
+ Archive->Push(0x0028,0x0005); // Image Dimension
+
// Create them if not found
// Always modify the value
// Push the entries to the archive.
CopyMandatoryEntry(0x0020, 0x0032,imagePositionRet,"DS");
Archive->Push(0x0020,0x0030);
CopyMandatoryEntry(0x0020, 0x0037,imageOrientationRet,"DS");
- Archive->Push(0x0020,0x0035);
- }
+ Archive->Push(0x0020,0x0035);
+ }
*/
-
+
// Samples Per Pixel (type 1) : default to grayscale
CheckMandatoryEntry(0x0028,0x0002,"1","US");
// --- Check UID-related Entries ---
// At the end, not to overwrite the original ones,
- // needed by 'Referenced SOP Instance UID', 'Referenced SOP Class UID'
+ // needed by 'Referenced SOP Instance UID', 'Referenced SOP Class UID'
// 'SOP Instance UID'
CopyMandatoryEntry(0x0008,0x0018,sop,"UI");
// See PS 3.3, Page 408
// DV = Digitized Video
- // DI = Digital Interface
+ // DI = Digital Interface
// DF = Digitized Film
// WSD = Workstation
// SD = Scanned Document
}
*/
-
+
// ---- The user will never have to take any action on the following ----
// new value for 'SOP Instance UID'
// Instance Creation Date
const std::string &date = Util::GetCurrentDate();
CopyMandatoryEntry(0x0008,0x0012,date,"DA");
-
+
// Instance Creation Time
const std::string &time = Util::GetCurrentTime();
CopyMandatoryEntry(0x0008,0x0013,time,"TM");
// Instance Number
CheckMandatoryEntry(0x0020,0x0013,"","IS");
-
+
// Patient Orientation
// Can be computed from (0020|0037) : Image Orientation (Patient)
GDCM_NAME_SPACE::Orientation *o = GDCM_NAME_SPACE::Orientation::New();
o->Delete();
if (ori != "\\" && ori != GDCM_UNFOUND)
CheckMandatoryEntry(0x0020,0x0020,ori,"CS");
- else
+ else
CheckMandatoryEntry(0x0020,0x0020,"","CS");
// Default Patient Position to HFS
CheckMandatoryEntry(it->first, 0x0000, "0");
}
// Third stage : update all 'zero level' groups length
-*/
+*/
if (PhotometricInterpretation == 1)
Archive->Restore(0x0020,0x000e);
}
-
/**
* \brief CallStartMethod
*/
{
UserFunction = 0;
ContentType = USER_OWN_IMAGE;
-
+
WriteMode = WMODE_RAW;
WriteType = ExplicitVR;
PhotometricInterpretation = 2; // Black = 0
-
+
PixelReadConverter = new PixelReadConvert;
PixelWriteConverter = new PixelWriteConvert;
Archive = new DocEntryArchive( FileInternal );
return raw;
}
-
/**
* \brief Deal with Grey levels i.e. re-arange them
* to have low values = dark, high values = bright
case 1: *buffer++ = (TBuffer)(*source++);
} while (--n > 0);
}
- }
-
-
+ }
}