📄 dicomfile.java
字号:
/*
* 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 + -