關於DICOM轉JPG_學習

關於一下代碼幾點說明:

1.使用以下代碼能夠將標準的DICOM文件解析爲JPG格式的文件;

2.DICOM文件內沒有Image時,程序會將不能處理的DICOM文件轉出;

3.在ImageReadParam強轉爲DicomImageReadParam時有時會有問題,希望有經驗的大神幫忙解決

4.以下代碼部分來源於網絡;地址:https://blog.csdn.net/ShallDid/article/details/77446462

5.如果有什麼問題,希望各位大神指正,再次感謝;




A:工具類(將不能轉換的DICOM文件複製到緩存文件夾)

package Other.Util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.List;
/**
* @author WL
* @version 1.0
* @CreatTime 2018年6月20日 上午12:49:50
*/
public class MyUtil {
/**
* 將文件從一個位置複製到另一個位置
* (使用FileChannel複製)
* 2018-06-20 GX
*/
@SuppressWarnings("resource")
public static void CopyFileUsingFileChannels(File source, File dest) throws IOException {    
        FileChannel inputChannel = null;    
        FileChannel outputChannel = null;    
    try{
        inputChannel = new FileInputStream(source).getChannel();
        outputChannel = new FileOutputStream(dest).getChannel();
        outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
    }finally{
        inputChannel.close();
        outputChannel.close();
    }

}

}


B:核心類DICOM轉JPG

package Other.Util;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import org.dcm4che3.data.Attributes;
import org.dcm4che3.imageio.plugins.dcm.DicomImageReadParam;
import org.dcm4che3.util.SafeClose;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.Feature;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class DcmTOJpg {
    private final ImageReader imageReader = ImageIO.getImageReadersByFormatName("DICOM").next();
    private float windowCenter;
    private float windowWidth;
    private boolean autoWindowing = true;
    private int windowIndex;
    private int voiLUTIndex;
    private boolean preferWindow = true;
    private Attributes prState;
    private int overlayActivationMask = 0xffff;
    private int overlayGrayscaleValue = 0xffff;
    private int frame = 1;  
    
public int getFrame() {
        return frame;
    }


    public void setFrame(int frame) {
        this.frame = frame;
    }


    public void setWindowCenter(float windowCenter) {
        this.windowCenter = windowCenter;
    }


    public void setWindowWidth(float windowWidth) {
        this.windowWidth = windowWidth;
    }


    public void setAutoWindowing(boolean autoWindowing) {
        this.autoWindowing = autoWindowing;
    }


    public void setWindowIndex(int windowIndex) {
        this.windowIndex = windowIndex;
    }


    public void setVoiLUTIndex(int voiLUTIndex) {
        this.voiLUTIndex = voiLUTIndex;
    }


    public void setPreferWindow(boolean preferWindow) {
        this.preferWindow = preferWindow;
    }


    public void setPrState(Attributes prState) {
        this.prState = prState;
    }


    public void setOverlayActivationMask(int overlayActivationMask) {
        this.overlayActivationMask = overlayActivationMask;
    }


    public void setOverlayGrayscaleValue(int overlayGrayscaleValue) {
        this.overlayGrayscaleValue = overlayGrayscaleValue;
    }


    public void convert(File src, File dest) throws IOException{
        Iterator<ImageReader> iter = ImageIO.getImageReadersByFormatName("DICOM");
        ImageReader reader = iter.next();      
        ImageInputStream iis = ImageIO.createImageInputStream(src);
        BufferedImage bi;
        OutputStream out = null;
        try{
            reader.setInput(iis, false);
            bi = readImage(iis);
            if (bi == null) {
                System.out.println("\nError: " + src + " - couldn't read!");
                return;
            }
            out = new BufferedOutputStream(new FileOutputStream(dest));
            //這裏也可以使用流將圖像導出到web應用,用來搭建web版的PACS等
            JPEGImageEncoder enc = JPEGCodec.createJPEGEncoder(out);  
            enc.encode(bi); 
        }finally{
            SafeClose.close(iis);
            SafeClose.close(out);
        }
    }

    private ImageReadParam readParam(){
    //獲取Object對象
    Object Temp = imageReader.getDefaultReadParam();
    //實例化子類對象
    DicomImageReadParam param = new DicomImageReadParam();
    //判定Object對象是否爲實例化對象
    if(Temp instanceof DicomImageReadParam) {
    param = (DicomImageReadParam)Temp;
    System.out.println(" ---> 判斷Object對象是否爲實例化對象DicomImageReadParam: " + Temp.equals(param));
    }else {
    param = (DicomImageReadParam)Temp;
    System.out.println(" ---> 確定Object對象不是實例化對象DicomImageReadParam: 通過強轉實現!" + param.getClass());
   
//    String STR = JSON.toJSON(Temp).toString();
//    param = JSON.parseObject(STR, param.getClass());
//    System.out.println(" ---> 確定Object對象不是實例化對象DicomImageReadParam: 通過JSON進行轉換!" + param.getClass());
   
    }
//      DicomImageReadParam param = (DicomImageReadParam) imageReader.getDefaultReadParam();
        param.setWindowCenter(windowCenter);
        param.setWindowWidth(windowWidth);
        param.setAutoWindowing(autoWindowing);
        param.setWindowIndex(windowIndex);
        param.setVOILUTIndex(voiLUTIndex);
        param.setPreferWindow(preferWindow);
        param.setPresentationState(prState);
        param.setOverlayActivationMask(overlayActivationMask);
        param.setOverlayGrayscaleValue(overlayGrayscaleValue); 
        return param;
    }

    private BufferedImage readImage(ImageInputStream iis) throws IOException{
        imageReader.setInput(iis);
        return imageReader.read(frame -1, readParam());
    }

}


C:具體調用

package Test_DCM2IMAGE;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Date;
import Other.Util.DcmTOJpg;
import Other.Util.MyUtil;
/**
* @author WL
* @version 1.0
* @CreatTime 2018年6月21日 下午12:39:02
*/
public class NoStandardDCM2IMAGE {
//Dicom源文件地址
public static String DCM_PATH = "E:/DESKTOP/PACS/TEST_NoStandardDcm2Image/Source_File";
//不能處理的Dicom文件臨時存儲位置
publicstatic String DCM_TEMP_PATH = "E:/DESKTOP/PACS/TEST_NoStandardDcm2Image/Temp_Folder/";
//DCM轉換成Image後存儲位置
public static String JPG_PATH = "E:/DESKTOP/PACS/TEST_NoStandardDcm2Image/Produce_Image";

/**
* DCM2IMAGE
*/
private static void DCM2IMAGE(String brID, String pacsID, String PEID) {
//參數
String brIDA = brID;
String pacsIDA = pacsID;
String PEIDA = PEID;

//源文件路徑
File src = null;
//Source_File源文件名
String File_Name = null;
//Image的fileName
String fileName = null;
try {
File DicomFile = new File(DCM_PATH);
File [] File_List = DicomFile.listFiles();
if (File_List.length != 0) {
for (int i = 0; i < File_List.length; i++) {
File_Name = File_List[i].getName();
System.out.println("NAME: " + File_Name + " Convert to Image" + " ---> STARTED ");
//dcm文件的具體位置
src = new File(DCM_PATH +"/"+ File_Name);
//PACSID+指定字符生成唯一文件夾
String Folder_Name = "IMAGE_PACS_" + pacsIDA;
//判斷存放Image文件夾是否存在
File Dest_Folder = new File(JPG_PATH +"/"+ Folder_Name);
if(!Dest_Folder.exists()) {
Dest_Folder.mkdirs();
fileName = String.valueOf(1);
}else {
File [] Image_List = Dest_Folder.listFiles();
        fileName = String.valueOf((Image_List.length) + 1);
}
//生成的JPEG圖像位置 
File dest = new File(Dest_Folder +"/"+ fileName + ".jpg");          
DcmTOJpg dcm2jpg = new DcmTOJpg();
dcm2jpg.convert(src, dest);
src.delete();
System.out.println("NAME: " + File_Name + " Convert to Image" + " ---> SUCCESS " + "\n");
}
}
} catch (Exception e) {
// e.printStackTrace();
String Message = e.getMessage();
String STRA = "ImageReadParam";
String STRB = "DicomImageReadParam";
String STRC = "imageIndex: 0";
if(Message.indexOf(STRA) != -1 || Message.indexOf(STRB) != -1) {
System.out.println("ImageReadParam CAST TO DicomImageReadParam FAIL");
//遞歸調用
DCM2IMAGE(brIDA, pacsIDA, PEIDA);
}else if(Message.indexOf(STRC) != -1) {
System.out.println(" ---> " + File_Name + " - <NO DICOM IMAGE FOUND>");
String Temp_Folder_Name = "DICOM_TEMP_" + pacsIDA;
//判斷指定文件夾是否存在
File Temp_Folder = new File(DCM_TEMP_PATH +"/"+ Temp_Folder_Name);
if(!Temp_Folder.exists()) {
Temp_Folder.mkdirs();
}
//不能處理的Dicom文件臨時存儲位置
File Temp = new File(Temp_Folder +"/"+ File_Name); 
try {
MyUtil.CopyFileUsingFileChannels(src, Temp);
System.out.println("COPY: " + File_Name + " - TO [" + Temp_Folder_Name + "] <COMPLETED>");
src.delete();
System.out.println("DELETE: " + File_Name + " - FROM SRC <COMPLETED>" + "\n");
} catch (IOException e1) {
e1.printStackTrace();
}
//遞歸調用
DCM2IMAGE(brIDA, pacsIDA, PEIDA);
}
}
}

/**
* 測試使用方法
* @param args
*/
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
String brIDB = "A0247896";
String pacsIDB = "MR18-16054";

// String brIDB = "A0544883";
// String pacsIDB = "CT18-18435";

// String brIDB = "B0243450";
// String pacsIDB = "CT18-18472";

// String brIDB = "A0544883";
// String pacsIDB = "CT18-18666";

String PEIDB = null;
//獲取DICOM文件
// GET_DICOM.getPacsFromDevice(brIDB, pacsIDB, PEIDB);
//將DICOM文件轉成IMAGE
DCM2IMAGE(brIDB, pacsIDB, PEIDB);
// GET_FILETYPE();
long endTime = System.currentTimeMillis();
System.out.println(" ---> DICOM convert to Image OR Copy to TEMP Completed! ---> 程序耗時:"+ (endTime - startTime) + "ms");
}

}


D:控制檯打印效果


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章