From 923b658e658b55cf4c1f4a36680acb7e0ad25adb Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 18 Mar 2011 12:21:58 +0000 Subject: [PATCH] Adde an isFileADicom(..) method to enable the loader to automatically identifier dicom files without making any assumptions about the file extension --- src/osgPlugins/dicom/ReaderWriterDICOM.cpp | 37 +++++++++------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/src/osgPlugins/dicom/ReaderWriterDICOM.cpp b/src/osgPlugins/dicom/ReaderWriterDICOM.cpp index 4cec450b6..97ea0bf3a 100644 --- a/src/osgPlugins/dicom/ReaderWriterDICOM.cpp +++ b/src/osgPlugins/dicom/ReaderWriterDICOM.cpp @@ -102,6 +102,17 @@ class ReaderWriterDICOM : public osgDB::ReaderWriter virtual const char* className() const { return "DICOM Image Reader/Writer"; } + bool isFileADicom(const std::string& filename) const + { + std::ifstream fin(filename.c_str(), std::ios::in | std::ios::binary); + if (!fin) return false; + + char str[133]; + str[128]=str[129]=str[130]=str[131]=0; + fin.getline(str, sizeof(str)); + return (str[128]=='D' && str[129]=='I' && str[130]=='C' && str[131]=='M'); + } + typedef std::vector Files; bool getDicomFilesInDirectory(const std::string& path, Files& files) const { @@ -122,8 +133,8 @@ class ReaderWriterDICOM : public osgDB::ReaderWriter } std::string localFile = path + "/" + *itr; - if (acceptsExtension(osgDB::getLowerCaseFileExtension(localFile)) && - osgDB::fileType(localFile) == osgDB::REGULAR_FILE) + + if (isFileADicom(localFile)) { files.push_back(localFile); } @@ -253,8 +264,6 @@ class ReaderWriterDICOM : public osgDB::ReaderWriter virtual ReadResult readImage(const std::string& file, const osgDB::ReaderWriter::Options* options) const { std::string ext = osgDB::getLowerCaseFileExtension(file); - if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED; - std::string fileName = file; if (ext=="dicom") { @@ -271,16 +280,9 @@ class ReaderWriterDICOM : public osgDB::ReaderWriter { getDicomFilesInDirectory(fileName, files); } - else + else if (isFileADicom(fileName) { -#if 1 files.push_back(fileName); -#else - if (!getDicomFilesInDirectory(osgDB::getFilePath(fileName), files)) - { - files.push_back(fileName); - } -#endif } if (files.empty()) @@ -520,8 +522,6 @@ class ReaderWriterDICOM : public osgDB::ReaderWriter info()<<"Reading DICOM file "<