dcmtk多帧影像转单帧

#include <dcmtk/dcmdata/dctk.h>
void mulTest()
{
    qDebug()<<"mulTest 0";
    QString path=u8"D:/1.3.12.2.1107.5.2.47.179640.2023081511473296234285371.dcm";
    DcmFileFormat* dicomFile=new DcmFileFormat();
    DcmDataset *dset = dicomFile->getDataset();
    OFCondition status = dicomFile->loadFile(path.toLocal8Bit().data());

    unsigned long frameCount = 128;
    qDebug()<<"frameCount is:"<<frameCount;
    if(status.good())
    {
        for(int i=0;i<frameCount;i++)
        {
            DcmFileFormat newFileFormat;
            unsigned long flags = CIF_UsePartialAccessToPixelData | CIF_AcrNemaCompatibility;
            DicomImage* dcmImage=new DicomImage(dset, dset->getOriginalXfer(), flags, i, 1);


            char newUID[100];
            dcmGenerateUniqueIdentifier(newUID, SITE_INSTANCE_UID_ROOT);
            DcmMetaInfo *newMetaInfo = newFileFormat.getMetaInfo();
            newMetaInfo->putAndInsertString(DCM_MediaStorageSOPClassUID, UID_MRImageStorage);
            newMetaInfo->putAndInsertString(DCM_MediaStorageSOPInstanceUID, newUID);
            DcmDataset *newDataset = newFileFormat.getDataset();


            // 获取图像像素数据
             const DiPixel* pixelData = dcmImage->getInterData();

             // 将图像像素数据添加到DcmDataset中
             if (pixelData)
             {
                 newDataset->putAndInsertUint8Array(DCM_PixelData, (Uint8*)pixelData->getData(), pixelData->getCount());
             }

            // 复制部分信息和标签
            newDataset->putAndInsertString(DCM_PatientName, "New Patient Name");
            newDataset->putAndInsertString(DCM_Modality, "CT");

            QString name=QString(u8"D:/mul/%1.dcm").arg(i);
            newFileFormat.saveFile(name.toLocal8Bit().data(), EXS_LittleEndianExplicit);

        }
    }
}

目前还有问题,待以后修复

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将多图像解析并保存为单张PNG图像,您可以使用DCMTK库和libpng库来完成。以下是一个示例代码: ```cpp #include "dcmtk/dcmdata/dctk.h" #include "dcmtk/dcmimgle/dcmimage.h" #include <png.h> void saveFrameAsPNG(const DicomImage& image, const std::string& outputFilename) { const Uint8* pixelData = (const Uint8*)image.getOutputData(8); const unsigned int width = image.getWidth(); const unsigned int height = image.getHeight(); FILE* file = fopen(outputFilename.c_str(), "wb"); if (!file) { // 处理文件打开失败的情况 return; } png_structp pngPtr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); if (!pngPtr) { // 处理PNG写入结构创建失败的情况 fclose(file); return; } png_infop infoPtr = png_create_info_struct(pngPtr); if (!infoPtr) { // 处理PNG信息结构创建失败的情况 png_destroy_write_struct(&pngPtr, nullptr); fclose(file); return; } png_init_io(pngPtr, file); png_set_IHDR(pngPtr, infoPtr, width, height, 8, PNG_COLOR_TYPE_GRAY, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); png_write_info(pngPtr, infoPtr); png_bytep row = new png_byte[width]; for (unsigned int y = 0; y < height; ++y) { for (unsigned int x = 0; x < width; ++x) { row[x] = pixelData[y * width + x]; } png_write_row(pngPtr, row); } png_write_end(pngPtr, nullptr); delete[] row; png_destroy_write_struct(&pngPtr, &infoPtr); fclose(file); } int main() { // 加载DICOM文件 DcmFileFormat fileFormat; OFCondition status = fileFormat.loadFile("input.dcm"); if (status.bad()) { // 处理加载文件失败的情况 return 1; } // 获取图像数据集 DcmDataset* dataset = fileFormat.getDataset(); // 创建DicomImage对象 DicomImage image(dataset, dataset->getCurrentXfer()); // 检查是否是多图像 if (image.isMultiFrame()) { // 获取数 unsigned int numFrames = image.getFrameCount(); // 逐保存为PNG图像 for (unsigned int frame = 0; frame < numFrames; ++frame) { std::string outputFilename = "output_frame" + std::to_string(frame) + ".png"; saveFrameAsPNG(image, outputFilename); image.gotoNextFrame(); } } else { // 单图像处理 saveFrameAsPNG(image, "output.png"); } return 0; } ``` 上述代码使用DCMTK库中的`DicomImage`类加载DICOM文件,并使用libpng库将图像数据保存为PNG格式。如果是多图像,它将逐保存为单独的PNG图像文件。确保在使用DCMTK和libpng库时遵循其相关许可协议。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值