⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dicomfile.java

📁 客户端浏览医学图像的jsp源代码。可用于临床工作站。
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
 * DicomFile.java - 僼傽僀儖偺僆乕僾儞丒僼傽僀儖偺愗傝弌偟丒VR偺夝愅
 *
 * Copyright(C) 2000, Nagoya Institute of Technology, Iwata laboratory and Takahiro Katoji
 * http://mars.elcom.nitech.ac.jp/dicom/
 *
 * @author	Takahiro Katoji(mailto:katoco@mars.elcom.nitech.ac.jp)
 * @version
 *
 */

package dicomviewer;

import java.io.*;
import java.text.*;
import java.net.*;
import java.util.*;

public class DicomFile {

  int             debug_level = 3;

  boolean         isLtlEndian;      // littleEndian揮憲峔暥偺偲偒丄true
  boolean         vrType;           // 柧帵揑VR偺応崌丄true
  boolean         patientPrivacy;   // 姵幰偺僾儔僀僶僔乕傪庣傞偨傔丄姵幰柤傪曄姺偡傞偲偒true
  boolean         VReqSQ = false;   // 僔乕働儞僗嬫愗傝崁栚偺偨傔偺僼儔僌
  boolean         containDic;       // DICOM帿彂偵娷傑傟傞僞僌偐丠
  boolean         dicomPart10;      // DICOM婯奿偺part10偺偲偒丄 true
  boolean         Part10Endian;     // dicomPart10揮憲峔暥梡flag
  boolean         Part10Endian2;
  boolean         Part10vr;         // dicomPart10vr梡flag
  boolean         Part10vr2;
  boolean         Part10flag;     // dicomPart10梡flag
  DicomDic        dicomDic;         // DICOM帿彂
  DicomData       dicomData;        // 奿擺偡傞僨乕僞偺敔


  // 僐儞僗僩儔僋僞
  public DicomFile(boolean argIsLtlEndian, boolean argVRType, boolean privacy, DicomDic argDicomDic) {
    patientPrivacy = privacy;
    isLtlEndian = Part10Endian = Part10Endian2 = argIsLtlEndian;
    vrType = Part10vr = Part10vr2 = argVRType;
    dicomDic = argDicomDic;
    dicomPart10 = Part10flag = false;
  }
  public DicomFile(boolean argIsLtlEndian, boolean argVRType, DicomDic argDicomDic) {
    this(argIsLtlEndian, argVRType, false, argDicomDic);
  }
  public DicomFile(DicomDic argDicomDic) {
    this(true, false, false, argDicomDic);
  }

  // DICOM僼傽僀儖傛傝愗傝弌偡
  public DicomData load(String imgURL){
    // 僨乕僞傪奿擺偡傞敔傪弨旛偡傞
    dicomData = new DicomData();

    try {

      URL urlConn;
      FileInputStream FinS;
      BufferedInputStream inS;
      DataInputStream din;

//      if(imgURL.matches("https*:\\p{ASCII}*")){
        System.out.println("http");
        // DICOM僼傽僀儖傪http偱僎僢僩偡傞偨傔偵URL傪嶌傞
        urlConn = new URL(imgURL);
        // InputStream傪嶌惉偡傞丅
        // 堦搙丄BufferedInputStream傪偐傑偡偙偲偵傛傝崅懍壔丅
        // InputStream inS = urlConn.openStream();
        inS = new BufferedInputStream(urlConn.openStream());
        din = new DataInputStream(inS);
        System.out.println("http");
//      }else{
//        System.out.println("file");
//        FinS = new FileInputStream(imgURL);
//        inS = new BufferedInputStream(FinS);
//        din = new DataInputStream(inS);
//        System.out.println("file");
//      }

      int tempInt;
      int part10sum = 0;
      int part10length = 0;
      byte[] buff2 = new byte[2];
      byte[] buff4 = new byte[4];

      String group;
      String number;
      String tag;
      String vr;
      int length;
      byte[] value;

      // 僼傽僀儖傪嵟屻傑偱撉傓
      while (din.read(buff2) != -1) {
        // 僞僌
        tempInt = readInt2(buff2);
        group  = Integer.toString((tempInt&0x0000f000)>>12,16);
        group += Integer.toString((tempInt&0x00000f00)>>8,16);
        group += Integer.toString((tempInt&0x000000f0)>>4,16);
        group += Integer.toString((tempInt&0x0000000f),16);
        din.readFully(buff2);
        tempInt = readInt2(buff2);
        number  = Integer.toString((tempInt&0x0000f000)>>12,16);
        number += Integer.toString((tempInt&0x00000f00)>>8,16);
        number += Integer.toString((tempInt&0x000000f0)>>4,16);
        number += Integer.toString((tempInt&0x0000000f),16);
        tag = ("("+group+","+number+")");

        // 僨僶僢僌梡
        if (debug_level > 3) System.out.println("currentTag is : " + tag);
        dicomData.setTag(tag);  // DicomData偵僙僢僩

        // DICOM帿彂偵娷傑傟偰偄傞偐偳偆偐丠
        containDic = dicomDic.isContain(tag);

        if(vrType && !VReqSQ){
          // 僼傽僀儖偑柧帵揑VR偺応崌
          StringBuffer sbuff = new StringBuffer(2);
          din.readFully(buff2);
          for(int i=0; i<2; i++)
	          sbuff.append((char)buff2[i]);
          dicomData.setVR(tag, sbuff.toString());

          // VR偵傛偭偰丄抣挿偝偑曄傢傞丅
          if(sbuff.toString().equals("OB") ||
             sbuff.toString().equals("OW") ||
             sbuff.toString().equals("SQ")) {
            // VR偑OB丄OW丄傑偨偼SQ偺応崌
            din.skip(2);
            // 抣挿偝(4bytes撉傒崬傓Version)
            din.readFully(buff4);
            length = readInt4(buff4);
            //DicomPart10梡挿偝庢摼
            if (Part10flag) part10sum += 4;
          } else {
            // VR偑OB丄OW丄傑偨偼SQ埲奜
	    // 抣挿偝(2bytes撉傒崬傓Version)
            din.readFully(buff2);
            length = readInt2(buff2);
          }
        } else{
      	  // 僼傽僀儖偑埫栙揑VR偺応崌
	  // VR偼DICOM帿彂偵偰僎僢僩偡傞丅
	  // 抣挿偝(4bytes撉傒崬傓Version)
          if(containDic) dicomData.setVR(tag, dicomDic.getVR(tag));
          else dicomData.setVR(tag, "na");
          din.readFully(buff4);
          length = readInt4(buff4);
        }

        // 僔乕働儞僗嬫愗傝崁栚偑偒偨傜丄僼儔僌傪曄偊傞
        if(tag.equals("(fffe,e0dd)")) VReqSQ = false;

        vr = dicomData.getVR(tag);
        // 僨僶僢僌梡
        if (debug_level > 3) System.out.println("currentVR is : " + vr);
        if (debug_level > 3) System.out.println("currentLength: " + length);

        //梫慺挿偝偑枹掕媊挿偝偺応崌
        if(length == -1) {
          VReqSQ = true;
          length = 0;
          if(tag.equals("(fffe,e000)")) VReqSQ = false;
        }

        // 抣
        value = new byte[length];
        din.readFully(value);
        dicomData.setValue(tag, value);

        // 僨乕僞偺庢摼
        if(containDic) {
          dicomData.setName(tag, dicomDic.getName(tag));
          dicomData.setVM(tag, dicomDic.getVM(tag));
          dicomData.setVersion(tag, dicomDic.getVersion(tag));
        }else {
          dicomData.setName(tag, "NotContainedInDICOMDictionary");
          dicomData.setVM(tag, "na");
          dicomData.setVersion(tag, "na");
        }

        // 僨僶僢僌梡
        if (debug_level > 3) System.out.println("currentName is : " + dicomData.getName(tag));

        this.analyzer(tag, vr);

        //DicomPart10梡夝愅
        if(Part10flag){
          if(tag.equals("(0002,0000)")){
            part10length = Integer.parseInt(dicomData.getAnalyzedValue(tag));
          }else{
            part10sum += length;
            part10sum += 8;
            if(part10length == part10sum){
              isLtlEndian = Part10Endian;
              vrType = Part10vr;
              Part10flag = false;
              part10length = 0;
              part10sum = 0;
            }
          }
          //DicomPart10帪丄揮憲峔暥夝愅
          if(tag.equals("(0002,0010)")){
            String TransferSyntax = dicomData.getAnalyzedValue(tag);
            if(TransferSyntax.matches("1.2.840.10008.1.2\\p{ASCII}??")){
              if (debug_level > 3) System.out.println("Implicit VR Little Endian");
              Part10Endian = true;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -