https://blog.csdn.net/Kelvin_Yan/article/details/38898387
1、下載DCMTK源碼和支持庫
我是複製過來的。只是爲了保存。2(b)裏邊說要設置目錄,沒有設置也可以編譯通過。
支持庫是dcmtk需要引用的第三方庫,包括tiff、png、xml、zlib、openssl庫
其中,庫文件以“_d.lib”結尾的是debug版本的庫,以“_o.lib”結尾的是release版本的庫
在編譯dcmtk之前,需要先在PC上配置好這些庫,方法如下:
(a)搜索“_d.lib”,得到7個結果,重命名把所有的“_d”刪除,然後將這些文件拷貝到VS2012的安裝目錄下的"\VC\lib\"
(b)搜索“include”,得到5個結果,將這些文件夾複製到VS2012的安裝目錄下的"VC",合併文件夾
(c)將“openssl-1.0.0c\bin”下的5個文件複製到VS2012的安裝目錄下的"\VC\bin\"
下一步就是編譯dcmtk源碼
2、編譯源碼
首先用CMAKE生成項目文件,步驟如下:
(a)設置CMAKE屬性。在“dcmtk-3.6.0”目錄下找到“CMakeLists.txt”,並打開,把所有的“/MT”替換爲“/MD”;查找“# DCMTK build options”,把“DCMTK_WITH_TIFF、DCMTK_WITH_PNG、DCMTK_WITH_XML、DCMTK_WITH_ZLIB、DCMTK_WITH_OPENSSL”這5項都設爲“ON”,保存。也可以不修改CMake文件,在cmake時勾選相應選項。
(b)生成項目文件。新建文件夾,用於存放編譯好的文件,CMAKE設置路徑、目標平臺,其他默認。對於tiff、png、xml、zlib、openssl庫要設置其目錄。
然後用VS2012編譯,步驟如下:
(a)打開剛剛生成的解決方案,Build一次“ALL_BUILD”
(b)Build一次"INSTALL"
最後編譯結果放在C:\Program Files (x86)\DCMTK,包括lib、include和bin
*編譯報錯
error LNK2026: 模塊對於 SAFESEH 映像是不安全的。
解決方法:1.逐個打開解決方案下的每個項目的“屬性頁”對話框。
2.單擊“鏈接器”文件夾,有的項目沒有。
3.單擊“命令行”屬性頁。
4.將 /SAFESEH:NO 鍵入“附加選項”框中,然後點擊應用。
3、測試demo
借用了zssure的代碼:點擊打開鏈接
實現功能:對DCM圖像進行JPEG壓縮,最後保存爲test_jpeg.dcm
項目屬性配置:1、包含目錄:C:\Program Files (x86)\DCMTK\include,庫目錄:C:\Program Files (x86)\DCMTK\lib
2、“C/C++”->"代碼生成"中的“運行庫”設爲“/MDd”
3、添加依賴項(視具體項目而不同):
netapi32.lib
wsock32.lib(注:這兩個是windows自帶的庫,必須引用,否則編譯報錯,很鬱悶官方並沒有對此作出說明- -!)
ofstd.lib
oflog.lib
dcmimgle.lib
ijg8.lib
ijg12.lib
ijg16.lib
dcmdata.lib
dcmimage.lib
dcmjpeg.lib
dcmnet.lib
zlib.lib
具體的依賴關係在這裏有所陳述:點擊打開鏈接
- #include "stdafx.h"
- #include "dcmtk/config/osconfig.h"
- #include "dcmtk/dcmdata/dctk.h"
- #include "dcmtk/dcmdata/dcpxitem.h"
- #include "dcmtk/dcmjpeg/djdecode.h"
- #include "dcmtk/dcmjpeg/djencode.h"
- #include "dcmtk/dcmjpeg/djcodece.h"
- #include "dcmtk/dcmjpeg/djrplol.h"
- int _tmain(int argc, _TCHAR* argv[])
- {
- DJEncoderRegistration::registerCodecs(); // register JPEG codecs
- DcmFileFormat fileformat;
- if (fileformat.loadFile("D:\\Document_x64\\Documents\\Visual Studio 2012\\Projects\\resource\\1.dcm").good())
- {
- DcmDataset *dataset = fileformat.getDataset();
- DcmItem *metaInfo = fileformat.getMetaInfo();
- DJ_RPLossless params; // codec parameters, we use the defaults
- // this causes the lossless JPEG version of the dataset to be created
- dataset->chooseRepresentation(EXS_JPEGProcess14SV1TransferSyntax, ¶ms);
- // check if everything went well
- if (dataset->canWriteXfer(EXS_JPEGProcess14SV1TransferSyntax))
- {
- // force the meta-header UIDs to be re-generated when storing the file
- // since the UIDs in the data set may have changed
- delete metaInfo->remove(DCM_MediaStorageSOPClassUID);
- delete metaInfo->remove(DCM_MediaStorageSOPInstanceUID);
- // store in lossless JPEG format
- fileformat.saveFile(".\\test_jpeg.dcm", EXS_JPEGProcess14SV1TransferSyntax);
- }
- }
- DJEncoderRegistration::cleanup(); // deregister JPEG codecs
- return 0;
- }