背景
前段時間博文 DICOM:dcm4che工具包怎樣壓縮dcm文件探討(前篇)提到了一個問題:“利用dcm4che工具包中的dcm2dcm來進行dcm文件的壓縮和加壓縮。即改變dcm文件里的Transfer Syntax,比如由1.2.840.10008.1.2(Implicit VR Little Endian)變成1.2.840.10008.1.2.4.70(JPEG LossLess,Non-Hierarchical,First_order Prediction Process 14)。
可是因為之前對Java中相關Image IO類不了解,因此並未找到問題的解決方式。
值得高興的是,在發文后不久就收到了熱心博友的郵件,並在附件中給出了解決方式須要的安裝包。
依照郵件的提示,經過在本地Eclipse調試,已驗證能夠順利攻克了該問題,特再發一文說明,並再次感謝博友nanarongrong無私相助。
博友解決方式:
本地環境已經依照博文前篇 DICOM:dcm4che工具包怎樣壓縮dcm文件探討(前篇)更換為32位環境。在此如博友nanrongrong在郵件中的說明所看到的。問題的解決辦法是本地32位JRE執行環境缺少clib_jiio.dll導致的,雙擊安裝郵件中的附件。
安裝完畢后能夠看到在在JRE的bin文件夾下多出了clib_jiio.dll文件。lib/ext文件夾下多出了jai_imageio.jar文件。
又一次在本地進行測試。輸入dcm2dcm -t 1.2.840.10008.1.2.4.70 c:\test.dcm c:\testjpeg.dcm
例如以下圖所看到的,命令行提示已經順利轉換成功。可是不要高興的太早,用DICOM閱讀器打開發現居然無法順利導入。
使用dcmtk提供的dcmdump工具。得到例如以下輸出結果:
如上圖所看到的。看過我專欄的博友應該立馬能夠反應出問題出錯的地方。DICOM中在壓縮和解壓縮問題中最常見的錯誤就是無法順利定位PixelData。或是PixelData數據寫入不完整(如博文DICOM醫學圖像處理:DICOM存儲操作之 “多幅JPG圖像數據存入DCM文件”中的實例)、或是PixelData數據長度寫入錯誤導致解析失敗(如本博文、博文DICOM醫學圖像處理:fo-dicom網絡傳輸之 C-Echo and C-Store等等)。用UltraEdit以二進制方式打開test-jpeg.dcm文件。定位到PixelData(0x7fe0 0010),例如以下圖所看到的:
依照DICOM3.0標准對壓縮PixelData的描寫敘述(為了方便描寫敘述。再次將博文中的截圖貼出來),每個壓縮片段Fragment(即標簽0xfffe e000)后須要明白指出興許片段的長度。而剛才得到的test-jpeg.dcm文件的第二個Fragment中的Value Length居然是00 00 00 00。
為了驗證我們的想法,在UltraEdit中手動寫入Fragment的長度。首先在UE中拖動到test-jpeg.dcm文件末尾,定位到0xfffe e0dd(即SequenceItem結束符)。位置為0x3A23D。起始位置為0x87C,由此得出長度為0x3A23D-0x87C+0x1=0x39A72,依照小段須排列為 72 9A 03 00。例如以下圖改動后能夠順利打開圖像
至此能夠順利的利用dcm2dcm工具完畢dcm文件的JPEG無損 壓縮,只是另一點點小問題。
繼續往下看。
dcm2dcm源代碼剖析:
從官網下載dcm4che2的源代碼。在Eclipse中導入后。啟動dcm4che-tool-dcm2dcmproject。調試參數配置例如以下:
注:jre調試環境應該指定為我們安裝jai_imageio-1_0_01-lib-windows-i586-jdk庫后的32位執行環境。
單步調試到DicomImageWriter.java中的writeBytesToSequence函數能夠看到順利寫入了PixelData的長度236146。即十六進制的0x39A72。因此能夠證明dcm2dcmproject源代碼沒有問題,可能是本地cmd環境下配置的dcm4che2-bin包比較舊導致出現的問題,又一次生成dcm4che2-tool-dcm2dcm.jar包。又一次再本地測試。能夠順利得到正確的圖像。
至此該問題順利解決!
jai_imageio庫:
感謝博友nanarongrong的熱心幫助,jai_imageio的Windows32位環境庫已順利上傳到CSDN,下載鏈接為:jai_imageio_for_win32
備注:依照dcm4chee官方安裝說明文檔。dcm4chee以及dcm4che2-tools在Linux32bits以及Linux64bits。以及Windows32bits能夠順利完畢dcm壓縮和解壓縮,只有Windows64bits環境不可,這也就是我們上文遇到的問題為什么將JRE切換到32位環境的問題。
作者:zssure@163.com
時間:2015/08/02