Improved handling of RGB data.

This commit is contained in:
Robert Osfield 2011-03-21 21:28:02 +00:00
parent 11007a03ee
commit f4110a7d84

View File

@ -28,6 +28,9 @@
#include <dcmtk/dcmdata/dcdeftag.h> #include <dcmtk/dcmdata/dcdeftag.h>
#include <dcmtk/dcmdata/dcuid.h> #include <dcmtk/dcmdata/dcuid.h>
#include <dcmtk/dcmimgle/dcmimage.h> #include <dcmtk/dcmimgle/dcmimage.h>
#include <dcmtk/dcmimgle/dimopx.h>
#include <dcmtk/dcmimage/dicopx.h>
#include "dcmtk/dcmimage/diregist.h"
#endif #endif
#ifdef USE_ITK #ifdef USE_ITK
@ -519,8 +522,6 @@ class ReaderWriterDICOM : public osgDB::ReaderWriter
virtual ReadResult readImage(const std::string& file, const osgDB::ReaderWriter::Options* options) const virtual ReadResult readImage(const std::string& file, const osgDB::ReaderWriter::Options* options) const
{ {
info()<<"Reading DICOM file "<<file<<" using DCMTK"<<std::endl;
std::string ext = osgDB::getLowerCaseFileExtension(file); std::string ext = osgDB::getLowerCaseFileExtension(file);
std::string fileName = file; std::string fileName = file;
if (ext=="dicom") if (ext=="dicom")
@ -542,12 +543,19 @@ class ReaderWriterDICOM : public osgDB::ReaderWriter
{ {
files.push_back(fileName); files.push_back(fileName);
} }
else
{
return ReadResult::FILE_NOT_HANDLED;
}
if (files.empty()) if (files.empty())
{ {
return ReadResult::FILE_NOT_FOUND; return ReadResult::FILE_NOT_FOUND;
} }
info()<<"Reading DICOM file "<<file<<" using DCMTK"<<std::endl;
osg::ref_ptr<osgVolume::ImageDetails> details = new osgVolume::ImageDetails; osg::ref_ptr<osgVolume::ImageDetails> details = new osgVolume::ImageDetails;
details->setMatrix(new osg::RefMatrix); details->setMatrix(new osg::RefMatrix);
@ -791,6 +799,12 @@ class ReaderWriterDICOM : public osgDB::ReaderWriter
if (dcmImage->getStatus()==EIS_Normal) if (dcmImage->getStatus()==EIS_Normal)
{ {
EP_Representation curr_pixelRep;
int curr_numPlanes;
GLenum curr_pixelFormat;
GLenum curr_dataType;
unsigned int curr_pixelSize;
// get the pixel data // get the pixel data
const DiPixel* pixelData = dcmImage->getInterData(); const DiPixel* pixelData = dcmImage->getInterData();
if(!pixelData) if(!pixelData)
@ -799,25 +813,45 @@ class ReaderWriterDICOM : public osgDB::ReaderWriter
return ReadResult::ERROR_IN_READING_FILE; return ReadResult::ERROR_IN_READING_FILE;
} }
osg::ref_ptr<osg::Image> imageAdapter = new osg::Image;
EP_Representation curr_pixelRep;
int curr_numPlanes;
GLenum curr_pixelFormat;
GLenum curr_dataType;
unsigned int curr_pixelSize;
// create the new image // create the new image
convertPixelTypes(pixelData, convertPixelTypes(pixelData,
curr_pixelRep, curr_numPlanes, curr_pixelRep, curr_numPlanes,
curr_dataType, curr_pixelFormat, curr_pixelSize); curr_dataType, curr_pixelFormat, curr_pixelSize);
// dcmImage->getFrameCount()
osg::ref_ptr<osg::Image> imageAdapter = new osg::Image;
if (dcmImage->isMonochrome())
{
imageAdapter->setImage(dcmImage->getWidth(), dcmImage->getHeight(), dcmImage->getFrameCount(), imageAdapter->setImage(dcmImage->getWidth(), dcmImage->getHeight(), dcmImage->getFrameCount(),
curr_pixelFormat, curr_pixelFormat,
curr_pixelFormat, curr_pixelFormat,
curr_dataType, curr_dataType,
(unsigned char*)(pixelData->getData()), (unsigned char*)(pixelData->getData()),
osg::Image::NO_DELETE); osg::Image::NO_DELETE);
}
else
{
imageAdapter->allocateImage(dcmImage->getWidth(), dcmImage->getHeight(), dcmImage->getFrameCount(),
curr_pixelFormat, curr_dataType);
void* data = imageAdapter->data(0,0,0);
unsigned long size = dcmImage->createWindowsDIB( data,
imageAdapter->getTotalDataSize(),
0,
imageAdapter->getPixelSizeInBits(),
0,
0);
if (size==0)
{
info()<<" dcmImage->createWindowsDIB() failed to create required imagery."<<std::endl;
continue;
}
}
if (!image) if (!image)
{ {
pixelRep = curr_pixelRep; pixelRep = curr_pixelRep;
@ -899,7 +933,9 @@ class ReaderWriterDICOM : public osgDB::ReaderWriter
} }
else else
{ {
warning()<<"Error in reading dicom file "<<fileName.c_str()<<", error = "<<DicomImage::getString(dcmImage->getStatus())<<std::endl; warning()<<"Error in reading dicom file "<<fileInfo.filename<<", error = "<<DicomImage::getString(dcmImage->getStatus())<<std::endl;
info()<<" dcmImage->getPhotometricInterpretation()="<<DicomImage::getString(dcmImage->getPhotometricInterpretation())<<std::endl;
info()<<" dcmImage->width="<<dcmImage->getWidth()<<", height="<<dcmImage->getHeight()<<" FrameCount="<< dcmImage->getFrameCount()<<std::endl;
} }
} }
} }