Module: $RCSfile: gdcmFileHelper.cxx,v $
Language: C++
- Date: $Date: 2007/08/21 12:51:09 $
- Version: $Revision: 1.120 $
+ Date: $Date: 2007/08/28 09:29:26 $
+ Version: $Revision: 1.123 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
// to get the pixels, user needs a gdcm::FileHelper
gdcm::FileHelper *fh = new gdcm::FileHelper(f);
+
// user may ask not to convert Palette (if any) to RGB
uint8_t *pixels = fh->GetImageDataRaw();
int imageLength = fh->GetImageDataRawSize();
+
// He can now use the pixels, create a new image, ...
uint8_t *userPixels = ...
-To re-write the image, user re-uses the gdcm::FileHelper
+//To re-write the image, user re-uses the gdcm::FileHelper
+gdcm::File *fh = new gdcm::FileHelper();
-fh->SetImageData( userPixels, userPixelsLength);
fh->SetTypeToRaw(); // Even if it was possible to convert Palette to RGB
// (WriteMode is set)
fh->SetPhotometricInterpretationToMonochrome1();
fh->SetWriteTypeToDcmExpl(); // he wants Explicit Value Representation
- // Little Endian is the default
- // no other value is allowed
+ // Little Endian is the default,
+ // bigendian not supported for writting
(-->SetWriteType(ExplicitVR);)
-->WriteType = ExplicitVR;
+fh->SetWriteTypeToJPEG(); // lossless compression
+fh->SetWriteTypeToJPEG2000(); // lossless compression
+
+fh->SetImageData( userPixels, userPixelsLength);
+or
+fh->SetUserData( userPixels, userPixelsLength); // this one performs compression, when required
+
fh->Write(newFileName); // overwrites the file, if any
-// or :
-fh->WriteDcmExplVR(newFileName);
-// ----------------------------- WARNING -------------------------
+
These lines will be moved to the document-to-be 'Developer's Guide'
WriteType : ImplicitVR, ExplicitVR, ACR, ACR_LIBIDO
PhotometricInterpretation : MONOCHROME2 (0=black), MONOCHROME2 (0=white)
-
+fh->SetImageData( userPixels, userPixelsLength);
+or
+fh->SetUserData( userPixels, userPixelsLength);
+ PixelWriteConverter->SetUserData(inData, expectedSize);
+
+
fh->SetWriteMode(WMODE_RAW / WMODE_RGB)
fh->SetWriteType( ImplicitVR/ExplicitVR/ACR/ACR_LIBIDO/JPEG/JPEG2000)
* not to deallocate its data before gdcm uses them (e.g. with
* the Write() method )
* @param inData user supplied pixel area (uint8_t* is just for the compiler.
- * user is allowed to pass any kind of pixelsn since the size is
+ * user is allowed to pass any kind of pixels since the size is
* given in bytes)
* @param expectedSize total image size, *in Bytes*
*/
void FileHelper::SetImageData(uint8_t *inData, size_t expectedSize)
{
PixelWriteConverter->SetUserData(inData, expectedSize);
+ /// \todo : shouldn't we call SetCompressJPEGUserData/SetCompressJPEG2000UserData
+ /// here, too?
}
/**
*/
void FileHelper::SetUserData(uint8_t *inData, size_t expectedSize)
{
+ // Shouldn't we move theese lines to FileHelper::Write()?
+/*
if( WriteType == JPEG2000 )
{
PixelWriteConverter->SetCompressJPEG2000UserData(inData, expectedSize, FileInternal);
{
PixelWriteConverter->SetUserData(inData, expectedSize);
}
+ */
+ // Just try!
+ PixelWriteConverter->SetUserData(inData, expectedSize);
}
/**
* @return false if write fails
*/
bool FileHelper::Write(std::string const &fileName)
-{
+{
CheckMandatoryElements(); //called once, here !
bool flag = false;
case Unknown: // should never happen; ExplicitVR is the default value
case ExplicitVR:
-
- // User should ask gdcm to write an image in Explicit VR mode
- // only when he is sure *all* the VR of *all* the DataElements is known.
- // i.e : when there are *only* Public Groups
- // or *all* the Shadow Groups are fully described in the relevant Shadow
- // Dictionnary
- // 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.
- // Better we let DocEntry::WriteContent to put vr=UN for undocumented Shadow Groups !
-
-/*
- e = FileInternal->GetFirstEntry();
- while (e != 0)
- {
- if (e->GetVR() == " ")
- {
- SetWriteTypeToDcmImplVR();
- SetWriteFileTypeToImplicitVR();
- flag = true;
- break;
- }
- e = FileInternal->GetNextEntry();
- }
-
- if (!flag)
- {
- SetWriteFileTypeToExplicitVR();
- }
- break;
-*/
-
+ // We let DocEntry::WriteContent to put vr=UN for undocumented Shadow Groups !
SetWriteFileTypeToExplicitVR();
break;
// SetWriteFileTypeToImplicitVR(); // ACR IS implicit VR !
break;
- /// \todo FIXME : JPEG may be either ExplicitVR or ImplicitVR
+ /// \todo FIXME : JPEG/JPEG2000 may be either ExplicitVR or ImplicitVR
case JPEG:
SetWriteFileTypeToJPEG();
+ // was :
+ //PixelWriteConverter->SetCompressJPEGUserData(
+ // inData, expectedSize, FileInternal);
+ PixelWriteConverter->SetCompressJPEGUserData(
+ PixelWriteConverter->GetUserData(),
+ PixelWriteConverter->GetUserDataSize(),FileInternal);
break;
case JPEG2000:
+ /// \TODO Maybe we should consider doing the compression here !
+ // PixelWriteConverter->SetCompressJPEG2000UserData(inData, expectedSize, FileInternal);
+
SetWriteFileTypeToJPEG2000();
+ PixelWriteConverter->SetCompressJPEG2000UserData(
+ PixelWriteConverter->GetUserData(),
+ PixelWriteConverter->GetUserDataSize(),
+ FileInternal);
+
break;
}
break;
}
- bool check = CheckWriteIntegrity(); // verifies length
+ bool check;
if (WriteType == JPEG || WriteType == JPEG2000)
check = true;
+ else
+ check = CheckWriteIntegrity(); // verifies length
if (check)
{
* (modifies, when necessary, photochromatic interpretation,
* bits allocated, Pixels element VR)
* WARNING : if SetPhotometricInterpretationToMonochrome1() was called
- * before Pixel Elements if modified :-(
+ * before Pixel Elements is modified :-(
*/
void FileHelper::SetWriteToRaw()
{
vr = "OW";
if ( FileInternal->GetBitsAllocated()==24 ) // For RGB ACR files
vr = "OB";
- // For non RAW data. Mainly JPEG
+ // For non RAW data. Mainly JPEG/JPEG2000
if( WriteType == JPEG || WriteType == JPEG2000)
{
vr = "OW";
PixelReadConverter->BuildRGBImage();
DataEntry *spp = CopyDataEntry(0x0028,0x0002,"US");
- spp->SetString("3 ");
+ spp->SetString("3 "); // Don't drop trailing space
DataEntry *planConfig = CopyDataEntry(0x0028,0x0006,"US");
- planConfig->SetString("0 ");
+ planConfig->SetString("0 "); // Don't drop trailing space
DataEntry *photInt = CopyDataEntry(0x0028,0x0004,"CS");
- photInt->SetString("RGB ");
+ photInt->SetString("RGB "); // Don't drop trailing space
if ( PixelReadConverter->GetRGB() )
{
}
}
- std::string pixelSpacing = FileInternal->GetEntryString(0x0028,0x0030);
- if ( pixelSpacing == GDCM_UNFOUND )
+ std::string pixelAspectRatio = FileInternal->GetEntryString(0x0028,0x0034);
+ if ( pixelAspectRatio == GDCM_UNFOUND ) // avoid conflict with pixelSpacing !
{
- pixelSpacing = "1.0\\1.0";
- // if missing, Pixel Spacing forced to "1.0\1.0"
- CopyMandatoryEntry(0x0028,0x0030,pixelSpacing,"DS");
- }
-
- // 'Imager Pixel Spacing' : defaulted to 'Pixel Spacing'
- // --> This one is the *legal* one !
- if ( ContentType != USER_OWN_IMAGE)
- // we write it only when we are *sure* the image comes from
- // an imager (see also 0008,0x0064)
- CheckMandatoryEntry(0x0018,0x1164,pixelSpacing,"DS");
-
+ std::string pixelSpacing = FileInternal->GetEntryString(0x0028,0x0030);
+ if ( pixelSpacing == GDCM_UNFOUND )
+ {
+ pixelSpacing = "1.0\\1.0";
+ // if missing, Pixel Spacing forced to "1.0\1.0"
+ CopyMandatoryEntry(0x0028,0x0030,pixelSpacing,"DS");
+ }
+
+ // 'Imager Pixel Spacing' : defaulted to 'Pixel Spacing'
+ // --> This one is the *legal* one !
+ if ( ContentType != USER_OWN_IMAGE)
+ // we write it only when we are *sure* the image comes from
+ // an imager (see also 0008,0x0064)
+ CheckMandatoryEntry(0x0018,0x1164,pixelSpacing,"DS");
+ }
/*
///Exact meaning of RETired fields