gucunlin gucunlin
关注数: 22 粉丝数: 3 发帖数: 866 关注贴吧数: 21
gdcm解压单文件多张压缩图像,解析后另存为单张文件 gdcm::ImageReader ir; ir.SetFileName(file.c_str()); if (!ir.Read()) return 1; const gdcm::Image& gimage = ir.GetImage(); const gdcm::TransferSyntax syntax = gimage.GetTransferSyntax(); if (gimage.GetTransferSyntax() == gdcm::TransferSyntax::JPEGBaselineProcess1 || gimage.GetTransferSyntax() == gdcm::TransferSyntax::JPEGExtendedProcess2_4 || gimage.GetTransferSyntax() == gdcm::TransferSyntax::JPEGLosslessProcess14_1) {//decompress //http://tieba.baidu.com/mo/q/checkurl?url=https%3A%2F%2Fstackoverflow.com%2Fquestions%2F27936473%2Fusing-gdcm-grassroots-dicom-to-decompress-dicom-image-data+&urlrefer=7a079e3936e76f6c876b16f94350d88a unsigned int numFrames = gimage.GetDimension(2); const gdcm::Tag rawTag(0x7fe0, 0x0010); // Default to Pixel Data //const gdcm::Tag rawTag(0xFFFE, 0xE000); const gdcm::DataElement& pdde = ir.GetFile().GetDataSet().GetDataElement(rawTag); const gdcm::SequenceOfFragments* sequent = pdde.GetSequenceOfFragments();//图像序列 numFrames = sequent->GetNumberOfFragments(); for (int i = 0; i < sequent->GetNumberOfFragments(); i++) { gdcm::Fragment frag = sequent->GetFragment(i); const gdcm::ByteValue* bv = frag.GetByteValue(); if (!bv) return 1; unsigned long totalLen = bv->GetLength(); std::vector<char> vbuffer; vbuffer.resize(totalLen); char* buffer = &vbuffer[0]; bv->GetBuffer(buffer, totalLen); //ir.GetFile().GetHeader(); const double* origin = gimage.GetOrigin(); //gdcm::PixmapWriter writer; //gdcm::Image newmap = writer.GetImage(); gdcm::Image* newmap = new gdcm::Image; newmap->SetNumberOfDimensions(2); //GetDimensions uint px = gimage.GetDimension(0); uint py = gimage.GetDimension(1); newmap->SetDimension(0, px); newmap->SetDimension(1, py); newmap->SetTransferSyntax(syntax); gdcm::DataElement pixeldata(gdcm::Tag(0x7fe0, 0x0010)); pixeldata.SetByteValue(buffer, totalLen); newmap->SetDataElement(pixeldata); gdcm::PixelFormat pf = gimage.GetPixelFormat(); newmap->SetPixelFormat(pf); //PixelData->GetPhotometricInterpretation( /* PhotometricInterpretation pi = PixelData->GetPhotometricInterpretation(); if( pi.GetSamplesPerPixel() != pf.GetSamplesPerPixel() ) { gdcmWarningMacro( "Photometric Interpretation and Pixel format are not compatible: " << pi.GetSamplesPerPixel() << " vs " << pf.GetSamplesPerPixel() ); return false; }*/ //dicompress gdcm::ImageChangeTransferSyntax* change = new gdcm::ImageChangeTransferSyntax(); gdcm::TransferSyntax newsyntax(gdcm::TransferSyntax::ImplicitVRLittleEndian); change->SetTransferSyntax(newsyntax); change->SetInput(*newmap); bool isok = change->Change(); //gdcm::Bitmap map = change->GetOutputAsBitmap(); gdcm::Image image = change->GetOutput(); int len = image.GetBufferLength(); image.SetIntercept(gimage.GetIntercept()); image.SetSlope(gimage.GetSlope()); image.SetPhotometricInterpretation(gimage.GetPhotometricInterpretation()); /*gdcm::PhotometricInterpretation pi = image.GetPhotometricInterpretation(); gdcm::PixelFormat pf = image.GetPixelFormat(); ushort temp1 = pi.GetSamplesPerPixel(); ushort temp2 = pf.GetSamplesPerPixel(); if (pi.GetSamplesPerPixel() != pf.GetSamplesPerPixel()) { gdcmWarningMacro("Photometric Interpretation and Pixel format are not compatible: " << pi.GetSamplesPerPixel() << " vs " << pf.GetSamplesPerPixel()); return false; }*/ gdcm::DataElement data; data = image.GetDataElement(); //ir.GetFile().GetDataSet().Remove(gdcm::Tag(0xFFFE, 0xE000)); const double* spacing = gimage.GetSpacing(); image.SetSpacing(0, spacing[0]); image.SetSpacing(1, spacing[1]); image.SetSpacing(2, spacing[2]); //gdcm::DataSet::SizeType type = ir.GetFile().GetDataSet().Remove(gdcm::Tag(0x2001,0x9000));//(0xFFFE, 0xE000)); const gdcm::Image* img2 = new gdcm::Image(image); gdcm::ImageWriter* writer = new gdcm::ImageWriter(); gdcm::DataElement sopuid = ir.GetFile().GetDataSet().GetDataElement(gdcm::Tag(0x0008, 0x0018)); char uid[100]; dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT); sopuid.SetByteValue(uid, strlen(uid)); const gdcm::ByteValue* bv2 = sopuid.GetByteValue(); std::string dup(bv2->GetPointer(), bv2->GetLength()); writer->SetFile(ir.GetFile()); writer->SetImage(*img2); //std::string filename = outpath.c_str(); char buff3[256] = {0}; sprintf(buff3, "%s%s%d.dcm", outpath.c_str(), imstr.c_str(),i); writer->SetFileName(buff3); writer->GetFile().GetDataSet().Remove(gdcm::Tag(0x0008, 0x0018)); writer->GetFile().GetDataSet().Insert(sopuid); if (!writer->Write()) { break; } }
gdcm解压jpegDicom文件 #include "gdcmImageReader.h" #include "gdcmImage.h" #include "gdcmWriter.h" #include "gdcmAttribute.h" #include "gdcmImageWriter.h" #include "gdcmImageChangeTransferSyntax.h" #include <iostream> #include <fstream> int main(int argc, char *argv[]) { if( argc < 3 ) { std::cerr << argv[0] << " input.dcm output.dcm" << std::endl; return 1; } const char *filename = argv[1]; const char *outfilename = argv[2]; gdcm::ImageReader reader; reader.SetFileName( filename ); if( !reader.Read() ) { std::cerr << "Could not read: " << filename << std::endl; return 1; } // The output of gdcm::Reader is a gdcm::File //gdcm::File &file = reader.GetFile(); // the dataset is the the set of element we are interested in: //gdcm::DataSet &ds = file.GetDataSet(); const gdcm::Image &image = reader.GetImage(); image.Print( std::cout ); gdcm::ImageChangeTransferSyntax change; change.SetTransferSyntax( gdcm::TransferSyntax::JPEG2000Lossless ); change.SetTransferSyntax( gdcm::TransferSyntax::JPEGLosslessProcess14_1 ); //change.SetTransferSyntax( gdcm::TransferSyntax::JPEGBaselineProcess1 ); //change.SetTransferSyntax( image.GetTransferSyntax() ); change.SetInput( image ); bool b = change.Change(); if( !b ) { std::cerr << "Could not change the Transfer Syntax" << std::endl; return 1; } //std::ofstream out( outfilename, std::ios::binary ); //image.GetBuffer2(out); //out.close(); gdcm::ImageWriter writer; writer.SetImage( change.GetOutput() ); writer.SetFile( reader.GetFile() ); writer.SetFileName( outfilename ); if( !writer.Write() ) { return 1; } return 0; }
#DCMTK#PDF封装成DICOM文件 #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmdata/dcencdoc.h" #include "dcmtk/ofstd/ofconapp.h" #ifdef WITH_ZLIB #include <zlib.h> /* for zlibVersion() */ #endif #define OFFIS_CONSOLE_APPLICATION "pdf2dcm" static OFLogger pdf2dcmLogger = OFLog::getLogger("dcmtk.apps." OFFIS_CONSOLE_APPLICATION); static char rcsid[] = "$dcmtk: " OFFIS_CONSOLE_APPLICATION " v" OFFIS_DCMTK_VERSION " " OFFIS_DCMTK_RELEASEDATE " $"; int main(int argc, char *argv[]) { OFConsoleApplication app(OFFIS_CONSOLE_APPLICATION, "Encapsulate PDF file into DICOM format", rcsid); OFCommandLine cmd; int errorCode = EXITCODE_NO_ERROR; OFCondition result = EC_Normal; DcmFileFormat fileformat; DcmEncapsulatedDocument encapsulator; OFLOG_TRACE(pdf2dcmLogger, "Including necessary options"); encapsulator.addPDFCommandlineOptions(cmd); OFLOG_TRACE(pdf2dcmLogger, "Evaluating command line"); prepareCmdLineArgs(argc, argv, OFFIS_CONSOLE_APPLICATION); if (app.parseCommandLine(cmd, argc, argv)) { OFLOG_TRACE(pdf2dcmLogger, "Checking exclusive options first"); if (cmd.hasExclusiveOption()) { if (cmd.findOption("--version")) { app.printHeader(OFTrue /*print host identifier*/); COUT << OFendl << "External libraries used: "; #ifdef WITH_ZLIB COUT << OFendl << "- ZLIB, Version " << zlibVersion() << OFendl; #else COUT << " none" << OFendl; #endif return EXITCODE_NO_ERROR; } } encapsulator.parseArguments(app, cmd); } //print resource identifier OFLOG_DEBUG(pdf2dcmLogger, rcsid << OFendl); OFLOG_DEBUG(pdf2dcmLogger, "making sure data dictionary is loaded"); if (!dcmDataDict.isDictionaryLoaded()) { OFLOG_WARN(pdf2dcmLogger, "no data dictionary loaded, check environment variable: " << DCM_DICT_ENVIRONMENT_VARIABLE); } OFLOG_DEBUG(pdf2dcmLogger, "Creating identifiers (and reading series data)"); result = encapsulator.createIdentifiers(pdf2dcmLogger); if (result.bad()) { OFLOG_FATAL(pdf2dcmLogger, "There was an error while reading the series data"); return EXITCODE_INVALID_INPUT_FILE; } OFLOG_INFO(pdf2dcmLogger, "creating encapsulated PDF object"); errorCode = encapsulator.insertEncapsulatedDocument(fileformat.getDataset(), pdf2dcmLogger); if (errorCode != EXITCODE_NO_ERROR) { OFLOG_ERROR(pdf2dcmLogger, "unable to create PDF encapsulation to DICOM format"); return errorCode; } OFLOG_INFO(pdf2dcmLogger, "Generating an instance number that is guaranteed to be unique within a series."); result = encapsulator.createHeader(fileformat.getDataset(), pdf2dcmLogger); if (result.bad()) { OFLOG_ERROR(pdf2dcmLogger, "unable to create DICOM header: " << result.text()); return EXITCODE_CANNOT_WRITE_OUTPUT_FILE; } OFLOG_INFO(pdf2dcmLogger, "writing encapsulated PDF object as file " << encapsulator.getOutputFileName()); OFLOG_INFO(pdf2dcmLogger, "Check if new output transfer syntax is possible"); DcmXfer opt_oxferSyn(encapsulator.getTransferSyntax()); fileformat.getDataset()->chooseRepresentation(encapsulator.getTransferSyntax(), NULL); if (fileformat.getDataset()->canWriteXfer(encapsulator.getTransferSyntax())) { OFLOG_INFO(pdf2dcmLogger, "Output transfer syntax " << opt_oxferSyn.getXferName() << " can be written"); } else { OFLOG_ERROR(pdf2dcmLogger, "No conversion to transfer syntax " << opt_oxferSyn.getXferName() << " possible!"); return EXITCODE_COMMANDLINE_SYNTAX_ERROR; } OFLOG_INFO(pdf2dcmLogger, "Checking for DICOM key overriding"); result = encapsulator.applyOverrideKeys(fileformat.getDataset()); if (result.bad()) { OFLOG_ERROR(pdf2dcmLogger, "There was a problem while overriding a key:" << OFendl << result.text()); return EXITCODE_CANNOT_WRITE_OUTPUT_FILE; } OFLOG_INFO(pdf2dcmLogger, "write converted DICOM file with metaheader"); result = encapsulator.saveFile(fileformat); if (result.bad()) { OFLOG_ERROR(pdf2dcmLogger, result.text() << ": writing file: " << encapsulator.getOutputFileName()); return EXITCODE_CANNOT_WRITE_OUTPUT_FILE; } OFLOG_INFO(pdf2dcmLogger, "PDF encapsulation successful"); return EXITCODE_NO_ERROR; }
通过dcmtk库获取qimage图像 平台VC + Qt //通过dcmtk库获取qimage图像 QImage getDicomImageByDCMTK(QString file) { QImage image; DicomImage dcmImage(file.toLocal8Bit().data()); // Check whether we have a valid image EI_Status result = dcmImage.getStatus(); if (result != EIS_Normal) { qDebug()<<(QString("Rendering of DICOM image failed for thumbnail failed: ") + DicomImage::getString(result)); return image; } // Select first window defined in image. If none, compute min/max window as best guess. // Only relevant for monochrome. if (dcmImage.isMonochrome()) { if (dcmImage.getWindowCount() > 0) { dcmImage.setWindow(0); } else { dcmImage.setMinMaxWindow(OFTrue /* ignore extreme values */); } } /* get image extension and prepare image header */ const unsigned long width = dcmImage.getWidth(); const unsigned long height = dcmImage.getHeight(); unsigned long offset = 0; unsigned long length = 0; QString header; if (dcmImage.isMonochrome()) { // write PGM header (binary monochrome image format) header = QString("P5 %1 %2 255\n").arg(width).arg(height); offset = header.length(); length = width * height + offset; } else { // write PPM header (binary color image format) header = QString("P6 %1 %2 255\n").arg(width).arg(height); offset = header.length(); length = width * height * 3 /* RGB */ + offset; } /* create output buffer for DicomImage class */ QByteArray buffer; /* copy header to output buffer and resize it for pixel data */ buffer.append(header); buffer.resize(length); /* render pixel data to buffer */ if (dcmImage.getOutputData(static_cast<void *>(buffer.data() + offset), length - offset, 8, 0)) { if (!image.loadFromData(buffer)) { qDebug()<<("QImage couldn't created"); return image; } } return image; }
1 下一页