样例程序
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)