GDCM样例

样例程序 

 Test.cpp

#include <iostream>
#include <vector>

#include "gdcmImage.h"
#include "gdcmImageReader.h"
#include "gdcmTag.h"

#include <string>
#include <locale>
#include <codecvt>
#include <Windows.h>

// UTF8转std:string
// 转换过程:先将utf8转双字节Unicode编码,再通过WideCharToMultiByte将宽字符转换为多字节。
std::string UTF8_To_string(const std::string& str)
{
    int nwLen = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0);
    wchar_t* pwBuf = new wchar_t[nwLen + 1];    //一定要加1,不然会出现尾巴 
    memset(pwBuf, 0, nwLen * 2 + 2);
    MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), pwBuf, nwLen);
    int nLen = WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
    char* pBuf = new char[nLen + 1];
    memset(pBuf, 0, nLen + 1);
    WideCharToMultiByte(CP_ACP, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);

    std::string strRet = pBuf;

    delete[]pBuf;
    delete[]pwBuf;
    pBuf = NULL;
    pwBuf = NULL;

    return strRet;
}

std::string getDICOMValue(const gdcm::DataSet& ds, const gdcm::Tag& specifiedTag)
{
    std::string value = "";
    if (ds.FindDataElement(specifiedTag) &&
        !ds.GetDataElement(specifiedTag).IsEmpty()) {
        gdcm::DataElement de = ds.GetDataElement(specifiedTag);
        const gdcm::ByteValue* bv = de.GetByteValue();
        assert(bv);
        value = std::string(bv->GetPointer(), bv->GetLength());
    }
    return value;
}

void gdcmReadDICOM() {
    gdcm::ImageReader reader;
    std::string filename = "0000.dcm";
    reader.SetFileName(filename.c_str());

    if (!reader.Read()) {
        std::cerr << "Could not read: " << filename << std::endl;
    }

    const gdcm::File& f = reader.GetFile();
    const gdcm::DataSet& ds = f.GetDataSet();

    reader.GetFile();

    gdcm::Tag serialInstanceUID(0x0020, 0x000E);
    std::cout << "serialInstanceUID: " << getDICOMValue(ds, serialInstanceUID) << std::endl;

    gdcm::Tag serialDescription(0x0008, 0x103E);
    std::cout << "serialDescription: " << getDICOMValue(ds, serialDescription) << std::endl;

    gdcm::Tag seriesThickness(0x0018, 0x0050);
    std::cout << "seriesThickness: " << getDICOMValue(ds, seriesThickness) << std::endl;

    gdcm::Tag bodyPartExamined(0x0008, 0x0015);
    std::cout << "bodyPartExamined: " << getDICOMValue(ds, bodyPartExamined) << std::endl;

    gdcm::Tag patientName(0x0010, 0x0010);
    std::string txt_uft8 = UTF8_To_string(getDICOMValue(ds, patientName));

    std::cout << "patientName: " << txt_uft8 << std::endl;
    
    gdcm::Tag patientSex(0x0010, 0x0040);
    std::cout << "patientSex: " << getDICOMValue(ds, patientSex) << std::endl;

    gdcm::Tag patientBirthDate(0x0010, 0x0030);
    std::cout << "patientBirthDate: " << getDICOMValue(ds, patientBirthDate) << std::endl;

    gdcm::Tag windowCenter(0x0028, 0x1050);
    std::cout << "windowCenter: " << getDICOMValue(ds, windowCenter) << std::endl;

    gdcm::Tag windowWidth(0x0028, 0x1051);
    std::cout << "windowWidth: " << getDICOMValue(ds, windowWidth) << std::endl;

    gdcm::Tag patientPosition(0x0018, 0x5100);
    std::cout << "patientPosition: " << getDICOMValue(ds, patientPosition) << std::endl;
   
    gdcm::Tag studyDate(0x0008, 0x0020);
    std::cout << "studyDate: " << getDICOMValue(ds, studyDate) << std::endl;

    std::set<gdcm::Tag> tags;
    tags.insert(gdcm::Tag(0x0020, 0x000E));

}

int main() {
    gdcmReadDICOM();
    return 0;
}

CMakeList.txt

cmake_minimum_required(VERSION 3.15)

project(gdcmTest)


find_package (GDCM REQUIRED)
    IF(GDCM_FOUND)
        INCLUDE(${GDCM_USE_FILE})
        SET(GDCM_LIBRARIES 
            gdcmcharls
            gdcmCommon
            gdcmDICT
            gdcmDSED
            gdcmexpat
            gdcmIOD
            gdcmjpeg12
            gdcmjpeg16
            gdcmjpeg8
            gdcmMEXD
            gdcmMSFF
            gdcmopenjp2
            gdcmzlib
            socketxx
            )
    ELSE(GDCM_FOUND)
        MESSAGE(FATAL_ERROR "Cannot find GDCM, did you set GDCM_DIR?")
    ENDIF(GDCM_FOUND)

include_directories(${GDCM_INCLUDE_DIRS})

add_executable(Test MACOSX_BUNDLE Test.cpp)
target_link_libraries(Test ${GDCM_LIBRARIES})

GDCM_LIBRARIES无法引用lib文件的问题 

FIND_PACKAGE(GDCM REQUIRED)
    IF(GDCM_FOUND)
        INCLUDE(${GDCM_USE_FILE})
        SET(GDCM_LIBRARIES 
            gdcmcharls
            gdcmCommon
            gdcmDICT
            gdcmDSED
            gdcmexpat
            gdcmgetopt
            gdcmIOD
            gdcmjpeg12
            gdcmjpeg16
            gdcmjpeg8
            gdcmMEXD
            gdcmMSFF
            gdcmopenjpeg
            gdcmzlib
            socketxx
            vtkgdcm
            Rpcrt4)
    ELSE(GDCM_FOUND)
        MESSAGE(FATAL_ERROR "Cannot find GDCM, did you set GDCM_DIR?")
    ENDIF(GDCM_FOUND)

参考:

c++ - Using GDCM via CMake - Stack Overflow

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GDCM(Grassroots DICOM)是一个开源的DICOM(数字成像与通信医疗信息)库,它支持读取和写入DICOM文件。如果你需要从ZIP文件中读取DICOM文件,可以使用GDCM的`gdcm::IPPSorter`类和`gdcm::ImageReader`类来实现。 首先,你需要使用`gdcm::IPPSorter`类将DICOM文件按照其图像位置(Image Position)信息进行排序。然后,你可以使用`gdcm::ImageReader`类从ZIP文件中读取DICOM文件。以下是一个示例代码: ``` #include "gdcmReader.h" #include "gdcmImageReader.h" #include "gdcmIPPSorter.h" int main(int argc, char* argv[]) { // 读取ZIP文件 gdcm::Reader reader; reader.SetFileName("example.zip"); if (!reader.Read()) { std::cerr << "Failed to read ZIP file" << std::endl; return 1; } // 使用IPPSorter类排序DICOM文件 gdcm::IPPSorter sorter; sorter.SetComputeZSpacing(true); sorter.SetZSpacingTolerance(1e-3); sorter.Sort(reader.GetFileSet()); // 读取第一个DICOM文件 gdcm::ImageReader image_reader; image_reader.SetFileName(sorter.GetFirstImage().c_str()); if (!image_reader.Read()) { std::cerr << "Failed to read DICOM file" << std::endl; return 1; } // 处理DICOM图像数据 // ... return 0; } ``` 在上面的代码中,`gdcm::Reader`类用于读取ZIP文件,`gdcm::IPPSorter`类用于按照图像位置信息进行排序,`gdcm::ImageReader`类用于读取DICOM文件。你需要根据自己的需求来处理DICOM图像数据。注意,以上代码仅仅是一个示例,可能需要根据实际情况进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值