这篇文章将为大家详细讲解有关Java怎么实现解析dcm医学影像文件并提取文件信息,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
具体如下:
一、安装
首先去Github 下载源码,然后执行mvn install进行本地安装,Maven中央仓库,竟然没有该jar。。安装成功之后如下:
然后在POM.XML文件中引入该jar包:
<dependency> <groupId>org.dcm4che</groupId> <artifactId>dcm4che-core</artifactId> <version>3.3.2</version> </dependency>
二、测试类
/** * projectName: xxx * fileName: DisplayTag.java * packageName: com.xxxx.xxxx.common.util * date: 2018-03-26 10:07 * copyright(c) 2017-2020 xxx公司 */ package com.gz.medicine.common.util; import java.awt.image.Raster; import java.io.File; import java.io.IOException; import java.sql.Time; import java.util.Arrays; import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; import org.dcm4che3.data.Attributes; import org.dcm4che3.data.ElementDictionary; import org.dcm4che3.data.Fragments; import org.dcm4che3.data.Sequence; import org.dcm4che3.data.Tag; import org.dcm4che3.data.VR; import org.dcm4che3.io.DicomEncodingOptions; import org.dcm4che3.io.DicomInputStream; import org.dcm4che3.io.DicomOutputStream; import org.dcm4che3.util.SafeClose; import java.awt.image.Raster; import java.io.IOException; import java.util.Arrays; /** * @version: V1.0 * @author: fendo * @className: DisplayTag * @packageName: com.xxxx.xxxx.common.util * @description: Tag解析 * @data: 2018-03-26 10:07 **/ public final class DisplayTag { private static Attributes obj=null, object =null; private static DicomInputStream din; private static double resultFactorDix; private String result = null; private Double result2 = null; private String nom = null; private String nounString = null; private int val2 = 0; private int valeurReturn; private String nounUnit = null; private static double resultFacteurDix = 0; private Double valueSpatial = null; private String nounUnitRatio = null; private DicomInputStream dis; private static final char[] HEX_DIGITS = { '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , 'A' , 'B' , 'C' , 'D' , 'E' , 'F' }; private DicomEncodingOptions encOpts = DicomEncodingOptions.DEFAULT; private static ElementDictionary dict = ElementDictionary.getStandardElementDictionary(); public DisplayTag(File file ){ try { setObject(loadDicomObject(file) ); } catch (IOException ex) { Logger.getLogger(DisplayTag.class.getName()).log(Level.SEVERE, null, ex); } } /** * Read metadata of Dicom 3.0 * @param f : input file * @return Attributes * @throws IOException */ public static Attributes loadDicomObject(File f) throws IOException { if (f == null){ return null; }else{ DicomInputStream dis = new DicomInputStream(f); //attr.setSpecificCharacterSet("GBK"); return dis.readDataset(-1, -1); } } /** * Put attribut * @param obj */ public void setObject(Attributes obj){ this.obj = obj; } /** * Giving attribut of metadata * @return */ public static Attributes getObject(){ return obj; } /** * Display metadata * @param file : file inout * @throws IOException */ public String readTagDicom(File file) throws IOException{ din = new DicomInputStream(file); object = din.readFileMetaInformation() ; String value = object.toString(); object = din.readDataset(-1, -1); return value; } /** * Permet d'afficher l'heure d'une valeur dicom en standard international yyyy.mm.dd/ Permit display time in format yyyy.mm.dd * @param Tag : valeur du tag / int tag * @param valueBool : si true Format yyyy.mm.dd sinon format dd.mm.yyyy/ if true then format yyyy.mm.dd else dd.mm.yyyy * @param valueNoun : "dot" mettre la date en format yyyy.mm.dd ou dd.mm.yyyy sinon en format yyyy mm dd ou dd mm yyyy/ "dot" put yyyy.mm.dd or dd.mm.dd or dd.mm.yyyy else yyyy mm or dd mm yyyy * @return afficher le string du tag selon le standard international/ return string Date * @throws IOException */ public String dicomDate(int Tag,boolean valueBool, String valueNoun) throws IOException{ if(getObject().contains(Tag)==true ){ String tagValue = getObject().getString(Tag); String tagDayFomat = FormatDate(tagValue,valueBool,valueNoun); return tagDayFomat; }else{ return null; } } /** * Permet d'afficher l'heure d'une valeur dicom en standard international yyyy.mm.dd/ Permit display a time in metadata for yyyy.mm.dd * @param object * @param Tag : valeur du tag/ value of tag * @param valueBool : si true Format yyyy.mm.dd sinon format dd.mm.yyyy/ if true format yyyy.mm.dd else dd.mm.yyyy * @param valueNoun : "dot" mettre la date en format yyyy.mm.dd ou dd.mm.yyyy sinon en format yyyy mm dd ou dd mm yyyy/dot" put yyyy.mm.dd or dd.mm.dd or dd.mm.yyyy else yyyy mm or dd mm yyyy * @return afficher le string du tag selon le standard international/ return string date * @throws IOException */ public static String dicomDate(Attributes object , int Tag,boolean valueBool, String valueNoun) throws IOException{ String tagValue = object.getString(Tag); String tagDayFomat = FormatDate(tagValue,valueBool,valueNoun); return tagDayFomat; } /** * Format tag * @param Numero : String date * @param valueBool : if true Format yyyy.mm.dd else format dd.mm.yyyy * @param valueNoun : "dot" put the date in format yyyy.mm.dd or dd.mm.yyyy else in format yyyy mm dd or dd mm yyyy * @return */ public static String FormatDate(String Numero, boolean valueBool,String valueNoun) { if (Numero.matches("^[0-9]*$")) {//If la chaine de caractère est un nombre ou un chiffre StringBuffer r = new StringBuffer(); if (valueBool ==true){//Format yyyy.mm.dd for (int i = 0, j = Numero.length(); i < j; i++) { r.append(Numero.charAt(i)); if ((i == 3)||(i == 5) ){ if(valueNoun == null ? "dot" == null : valueNoun.equals("dot")){ r.append('.'); }else{ r.append(' '); } } } return r.toString(); }else{ for (int i = 6, j =8; i<j; i++) {//jours r.append(Numero.charAt(i)); if(i ==7 ){ if(valueNoun == null ? "dot" == null : valueNoun.equals("dot")){ r.append('.'); }else{ r.append(' '); } } } for (int i = 4, j =6; i<j; i++) { r.append(Numero.charAt(i));//The first char value of the sequence is at index zero, the next at index one, and so on, as for array indexing. if(i ==5 ){ if(valueNoun == null ? "dot" == null : valueNoun.equals("dot")){ r.append('.'); }else{ r.append(' '); } } } for (int i = 0, j =4; i<j; i++) { r.append(Numero.charAt(i));//The first char value of the sequence is at index zero, the next at index one, and so on, as for array indexing. } return r.toString(); } } return Numero; } /** * Read value tag of VR = DA * * If use setDicomObject(readDicomObject(File f)), and getHeaderDateValue(getDicomObject()) * @param tagNr "0000,0010" * @return */ public Date getHeaderDateValue(String tagNr) { return getHeaderDateValue(toTagInt(tagNr)); } /** * Read value tag of VR = DA * * @param tagNr see dcm4che2 * @return */ public Date getHeaderDateValue(int tagNr) { return getObject().getDate(tagNr); } /** * Converts the string representation of a header number * e.g. 0008,0010 to the corresponding integer as 0x00080010 * as used in the @see org.dcm4che2.data.Tag * @param headerNr e.g. 0008,0010 * @return 0x00080010 as int */ public static int toTagInt(String headerNr){ return Integer.parseInt(headerNr.replaceAll(",", ""), 16); } /** * Read value tag of VR = DA * @param tagNr * @param dicomObj * @return */ public Date getHeaderDateValue(int tagNr,Attributes dicomObj) { return dicomObj.getDate(tagNr); } /** * Read value tag of VR = DA * @param tagNr :"0000,0010" * @param dicomObj * @return */ public Date getHeaderDateValue(String tagNr,Attributes dicomObj) { return getHeaderDateValue(toTagInt(tagNr), dicomObj); } /** * Remove string ^ in file dicom * @param num * @return */ public static String texteDicom(String num) { num = num.replaceAll("\\^+", " "); return num; } /** * Convertor tag to String * Using VM !=1 * example result [25, 25] * @param Tag * @return */ public static String getStringTag(Attributes object, int Tag){ String tagValue2[] = object.getStrings(Tag);//Conversion table in List to String String tagValue = Arrays.asList(tagValue2).toString(); return tagValue; } /** * Convertor tag to String * Using VM !=1 * example result 25/25 * @param object * @param Tag * @return */ public static String getStringTag2(Attributes object, int Tag){ String tagValue2[] = object.getStrings(Tag);//Conversion table in List to String String tagValue =DisplayTag.arrayToString(tagValue2,"\\"); return tagValue; } /** * Convert an array of strings to one string * Put the 'separator' string between each element * @param a * @param separator * @return */ public static String arrayToString(String[] a, String separator){ StringBuffer result = new StringBuffer(); if(a.length>0) { result.append(a[0]); for(int i=1;i<a.length;i++){ result.append(separator); result.append(a[i]); } } return result.toString(); } /** * Permit display time in hh.mm.ss * (0008,0030) AT S Study Time * (0008,0031) AT S Series Time * (0008,0032) AT S Acquisition Time * (0008,0033) AT S Image Time * @param Tag : giving tag * @return * @throws IOException */ public String dicomTime(int Tag) throws IOException{ if(getObject().contains(Tag)==true ){ String tagValue = getObject().getString(Tag); String tagValueNotDot = formatNotDot(tagValue); String tagTimeFomat = FormatTimes(tagValueNotDot); return tagTimeFomat; } else { return null; } } /** * Permit display time in hh.mm.ss.fac * (0008,0030) AT S Study Time * (0008,0031) AT S Series Time * (0008,0032) AT S Acquisition Time * (0008,0033) AT S Image Time * @param Tag : giving tag * @return * @throws IOException */ public String dicomTimeTotal( int Tag) throws IOException{ if(getObject().contains(Tag)==true ){ String tagValue = getObject().getString(Tag); String tagTimeFomat = FormatTimes(tagValue); return tagTimeFomat; } else { return null; } } /** * Permit display time in hh.mm.ss * (0008,0030) AT S Study Time * (0008,0031) AT S Series Time * (0008,0032) AT S Acquisition Time * (0008,0033) AT S Image Time * @param object : Metadata * @param Tag : value dicom * @return new value String * @throws IOException */ public String dicomTime2(Attributes object, int Tag) throws IOException{ String tagValue = object.getString(Tag); String tagValueNotDot = formatNotDot(tagValue); System.out.println(FormatTime(tagValueNotDot)); String tagTimeFomat = FormatTimes(tagValueNotDot); return tagTimeFomat; } /** * Permit display time in hh.mm.ss.frac * (0008,0030) AT S Study Time * (0008,0031) AT S Series Time * (0008,0032) AT S Acquisition Time * (0008,0033) AT S Image Time * @param object : Metadata * @param Tag : value dicom * @return new value String * @throws IOException */ public String dicomTime3(Attributes object, int Tag) throws IOException{ String tagValue = object.getString(Tag); String tagTimeFomat = FormatTimes(tagValue); return tagTimeFomat; } /** * reads a int value from the Dicomheader * @param tagNr the Tag to read * @return the value as int */ public int getHeaderIntegerValue(int tagNr) { return getObject().getInt(tagNr,0); } /** * * @param tagNr e.g. "0018,0050" to get Slice Thickness<br> * or "0008,0102#0054,0220" to get the Coding Scheme Designator after View Code Sequence * @return int */ public int getHeaderIntegerValue(String tagNr) { return getHeaderIntegerValue(toTagInt(tagNr)); } /** * checks if the Header contains the given tag * @param tagNr * @return */ public boolean containsHeaderTag(String tagNr) { return containsHeaderTag(toTagInt(tagNr)); } /** * checks if the Header contains the given tag * @param tagNr * @return */ public boolean containsHeaderTag(int tagNr) { return getObject().contains(tagNr); } /** * returns the name of the given Tag * @param tagNr * @return */ public static String getHeaderName(int tagNr) { return dict.keywordOf(tagNr); } /** * returns the name of the given Header field * @param tagNr * @return the name of the Field e.g. Patients Name */ public String getHeaderName(String tagNr) { try { return getHeaderName(toTagInt(tagNr)); } catch (Exception e) { return ""; } } /** * returns the String representation of the given header field * if it exists in the header * @param tagNr * @return */ public String getHeader(int tagNr) { try { String dcmele = getObject().getString(tagNr); return toElementString(dcmele, tagNr); } catch (Exception e) { return ""; } } private static String toElementString(String dcmele,int tag) { StringBuffer sb = new StringBuffer(); int TAG[] = getObject().tags(); StringBuffer append = sb.append(TAG) .append(" [").append(getObject().getVR(tag)).append("] ") .append(object.tags()).append(": ") .append(dcmele); return sb.toString(); } /** * checks wether the header is empty or not * @return */ public boolean isEmpty() { if (getObject() == null || getObject().isEmpty()) { return true; } return false; } /** * Converts the string representation of a header number * e.g. 0008,0010 to the corresponding integer as 0x00080010 * as used in the @see org.dcm4che2.data.Tag * @param headerNr e.g. 0008,0010 * @return 0x00080010 as int */ public static int toTagInt2(String headerNr){ return Integer.parseInt(headerNr.replaceAll(",", ""), 16); } /** * Removing comma in String * @param num * @return */ public static String formatNotDot(String num) { num = num.trim().replaceAll("[^0-9\\+]", ""); if (num.matches("^0*$")){ num = ""; } return num; } /** * Format * hh.mm.ss * @param Numero * @return */ public static String FormatTime(String Numero) { if (Numero.matches("^[0-9]*$")) { StringBuilder r = new StringBuilder(); for (int i = 0, j = 6; i < j; i++) { r.append(Numero.charAt(i)); if ((i % 2 == 1) && (i < (j - 1))){ r.append(':'); } } return r.toString(); } return Numero; } /** * Format * hh.mm.ss.frac * @param Numero * @return */ public static String FormatTimes(String Numero) { if (Numero.matches("^[0-9].*$")) { StringBuilder r = new StringBuilder(); for (int i = 0,j=Numero.length();i<j; i++) { r.append(Numero.charAt(i)); if ((i % 2 == 1)&(i<5)){ r.append(':'); } } return r.toString(); } return Numero; } /** * Round double after dot * @param a : value convertor * @param n number of decade * @return new value */ public double floor(double a, int n){ double p =Math.pow(10.0,n); return Math.floor((a*p)+0.5)/p; } /** * Giving power * Example: * setFactorPower(10,2)//10^2 * @param result3 * @param factor * @return * @return */ public static double setFactorPower(double result3, double factor){ return resultFactorDix= Math.pow(result3, factor); } /** * Giving getFactorPower */ public static double getFactorPower(){ return resultFactorDix; } /** * Giving pixelData * @param dcmObj * @return */ public static int[] lattricePixelData(Attributes dcmObj){ int[] data = dcmObj.getInts(Tag.PixelData); return data; } /** * Giving pixel data * @return * @throws IOException */ public int[] lattricePixelData2() throws IOException{ int[] data = getObject().getInts(Tag.PixelData); return data; } /** * Giving pixel data * @param dcmObj * @return * @throws IOException */ public byte[] lattricePixelDataBytes(Attributes dcmObj) throws IOException{ byte[] data = dcmObj.getBytes(Tag.PixelData); return data; } /** * Giving pixel data * @return * @throws IOException */ public byte[] lattricePixelDataBytes2() throws IOException{ byte[] data = getObject().getBytes(Tag.PixelData); return data; } /** * Extraction PixelData * @param raster of dicom * @return */ private int[][] extractData(Raster raster) { int w = raster.getWidth(); int h = raster.getHeight(); System.out.printf("w = %d h = %d%n", w, h); //WritableRaster raster = (WritableRaster) getMyImage(); int[][] data = new int[h][w]; for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { data[y][x] =raster.getSample(x, y, 0); } } return data; } /** * Extraction PixelData * @return */ private int[] getPixelData(int[][] data2){ int h = data2.length; int w = data2[0].length; int[] array = new int[h*w]; for(int y = 0; y < h; y++) { for(int x = 0; x < w; x++) { int index = y*w + x; array[index] = data2[y][x];//ligne } } return array; } /** * Return value table input * @param object * @param PATIENT_ADDITIONAL_TAGS : Table int * * example : * public static final int[] tag = { 0x00080020, 0x00080022, }; * *FileInputStream fis = new FileInputStream(fileInput); *DicomInputStream dis = new DicomInputStream(fis); *DicomObject obj = dis.readDicomObject(); *String nounValue[] =getValue(obj,tag); * * @return */ private static String[] getValue(Attributes object, int[] PATIENT_ADDITIONAL_TAGS){ String [] value = new String [PATIENT_ADDITIONAL_TAGS.length]; int i =0; while (i<PATIENT_ADDITIONAL_TAGS.length){ for (int tag : PATIENT_ADDITIONAL_TAGS) { value[i]=object.getString(tag); i++; } //System.out.print(value[0]+"\n"); //System.out.print(value[1]); } return value; } /** * Reading VR = SQ * * @param inputFile : File * @param tag : VR =SQ * @return */ public String[] readItem (File inputFile, int tag){ DisplayTag dcm = new DisplayTag(inputFile); Sequence seq= dcm.getObject().getSequence(tag); String valueString[] = new String[seq.size()]; for (int i = 0; i<seq.size(); i++){ Attributes attr = seq.get(i); valueString[i] = attr.toString(); } return valueString; } /** * Value inside VR = SQ * @param inputFile : input File * @param tagSQ : tag VR = SQ * @param tag : Tag inside VR= SQ * @return */ public String tagItem(File inputFile, int tagSQ, int tag){ String valueString = null; DisplayTag dcm = new DisplayTag(inputFile); Sequence seq= dcm.getObject().getSequence(tagSQ); Attributes attr = seq.get(0); valueString = attr.getString(tag); return valueString; } /** * Les unités spécifiques selon les tags pour vr= SQ/ Unity specical for tags VR= SQ * @param TAG : * - RegionSpatialFormat * - RegionDataType * - PhysicalUnitsXDirection * - PhysicalUnitsXDirection * - PixelComponentPhysicalUnits * * * * @param result : value string */ public void unit(int TAG, String result){ if (TAG == Tag.RegionSpatialFormat ){ val2= Integer.valueOf(result).intValue();//convertie en int switch(val2) { case 5: setNounUnit("Graphics"); break; case 4: setNounUnit("Wave form(physiological traces, doppler traces,..."); break; case 3: setNounUnit("Spectral(CW or PW Doppler"); break; case 2: this.setNounUnit("M-Mode(tissue or flow)"); break; case 1: this.setNounUnit("2D(tissue or flow"); break; case 0: setNounUnit("None or not applicable"); break; default: break; } }else if (TAG == Tag.RegionDataType ){ val2= Integer.valueOf(result).intValue();//convertie en int switch(val2) { case 12: setNounUnit("Orther Physiological(Amplitude vs. Time)"); break; case 11: setNounUnit("d(area)/dt"); break; case 10: setNounUnit("Area Trace"); break; case 9: setNounUnit("d(Volume)/dt Trace"); break; case 8: setNounUnit("Volume Trace"); break; case 7: setNounUnit("Doppler Max Trace"); break; case 6: this.setNounUnit("Doppler Mode Trace"); break; case 5: this.setNounUnit("Doppler Mean Trace"); break; case 4: setNounUnit("CW Spectral Doppler"); break; case 3: this.setNounUnit("PW Spectral Doppler"); break; case 2: this.setNounUnit("Color Flow"); break; case 1: this.setNounUnit("Tissue"); break; case 0: this.setNounUnit("None or not applicable"); break; default: break; } switch (result) { case "A": this.setNounUnit("ECG Trace"); break; case "B": this.setNounUnit("Pulse Trace"); break; case "C": this.setNounUnit("Phonocardiogram Trace"); break; case "D": this.setNounUnit("Gray bar"); break; case "E": this.setNounUnit("Color bar"); break; case "F": this.setNounUnit("Integrated Backscatter"); break; default: return; } }else if (TAG == Tag.PhysicalUnitsXDirection || TAG == Tag.PhysicalUnitsXDirection || TAG == Tag.PixelComponentPhysicalUnits){ val2= Integer.valueOf(result).intValue();//convertie en int switch(val2) { case 9: setNounUnit("cm*cm.pixel/sec"); break; case 8: setNounUnit("cm*cm/pixel"); break; case 7: setNounUnit("cm*pixel/sec"); break; case 6: this.setNounUnit("dB*pixel/seconds"); break; case 5: this.setNounUnit("hertz/pixel"); break; case 4: setNounUnit("seconds/pixel"); break; case 3: this.setNounUnit("cm/pixel"); break; case 2: this.setNounUnit("dB/pixel"); break; case 1: this.setNounUnit("percent/pixel"); break; case 0: this.setNounUnit("None or not applicable"); break; default: break; } switch (result) { case "A": this.setNounUnit("cm*cm*cm/pixel"); break; case "B": this.setNounUnit("cm*cm*cm*pixel/sec"); break; case "C": this.setNounUnit("degrees"); break; } }else if (TAG == Tag.PixelComponentDataType ){ val2= Integer.valueOf(result).intValue();//convertie en int switch(val2) { case 9: setNounUnit("Computed Border"); break; case 8: setNounUnit("Integrated Backscatter"); break; case 7: setNounUnit("Color bar"); break; case 6: this.setNounUnit("Gray bar"); break; case 5: this.setNounUnit("Color Flow Intensity"); break; case 4: setNounUnit("Color Flow Variance"); break; case 3: this.setNounUnit("Color Flow Velocity"); break; case 2: this.setNounUnit("Spectral doppler"); break; case 1: this.setNounUnit("Tissue"); break; case 0: this.setNounUnit("None or not applicable"); break; default: break; } if("A".equals(result)){ this.setNounUnit("Tissue Classification"); } } else { this.setNounUnit("None or not applicable"); } } /** * Enregistre l'unité des items/ Put unity of items * @param nounUnit * @return this.nounUnit = nounUnit */ public String setNounUnit(String nounUnit){ return this.nounUnit = nounUnit; } /** * On obtient l'unité des items./Giving unity of items * @return le nom de l'unité */ public String getNounUnit(){ return nounUnit; } /** * Special Ratio Spatial toutes les unites sont en mm/ Giving tag ratio Spatial of mm * @param TAG : entree choisi * - PhysicalUnitsXDirection * - PhysicalUnitsYDirection * -PixelComponentPhysicalUnits * * @param result: prend l'unite */ public void unitRatioSpatial(int TAG, String result){ if (TAG == Tag.PhysicalUnitsXDirection || TAG == Tag.PhysicalUnitsYDirection || TAG == Tag.PixelComponentPhysicalUnits){ val2= Integer.valueOf(result).intValue();//convertie en int switch(val2) { case 9: Double valueSpatial1 = getValeurTagItemDoubleRatio()* setFacteurPuissance(10,1); setTagItemDoubleRatio(valueSpatial1);//prend la valeur setNounUnitRatio("mm*mm.pixel/sec"); break; case 8: Double valueSpatial2 = getValeurTagItemDoubleRatio()* setFacteurPuissance(10,1); setTagItemDoubleRatio(valueSpatial2);//prend la valeur setNounUnitRatio("mm*mm/pixel"); break; case 7: setNounUnitRatio("mm*pixel/sec"); break; case 6: this.setNounUnitRatio("dB*pixel/seconds"); break; case 5: this.setNounUnitRatio("hertz/pixel"); break; case 4: setNounUnitRatio("seconds/pixel"); break; case 3: this.setNounUnitRatio("mm/pixel"); break; case 2: this.setNounUnitRatio("dB/pixel"); break; case 1: this.setNounUnitRatio("percent/pixel"); break; case 0: this.setNounUnitRatio("None or not applicable"); break; default: break; } switch (result) { case "A": Double valueSpatial3 = getValeurTagItemDoubleRatio()* setFacteurPuissance(10,2); setTagItemDoubleRatio(valueSpatial3);//prend la valeur this.setNounUnitRatio("mm*mm*mm/pixel"); break; case "B": Double valueSpatial4 = getValeurTagItemDoubleRatio()* setFacteurPuissance(10,2); setTagItemDoubleRatio(valueSpatial4);//prend la valeur this.setNounUnit("mm*mm*mm*pixel/sec"); break; case "C": this.setNounUnit("degrees"); break; } } } /** * Prend la valeur d'un Ratio Spatial/Put value Ratio Spatial * @param valueSpatial * @return */ public Double setTagItemDoubleRatio(double valueSpatial){ return this.valueSpatial = valueSpatial; } /** * Donne la valeur du Ratio/Diving value ratio Spatial * @return */ public Double getValeurTagItemDoubleRatio(){ return valueSpatial; } /** * Donne les valeurs calculer des puissances/ Put and computing power * @param result3 * @param facteur * @return * @return */ public static double setFacteurPuissance(double result3, double facteur){ return resultFacteurDix = Math.pow(result3, facteur); } /** * Obtient la valeur de puissance/ Giving value power * @return */ public static double getFacteurPuissance(){ return resultFacteurDix; } /** * Enregistre l'unite des items /Put unity unity items * @return this.nounUnit = nounUnit */ public String setNounUnitRatio(String nounUnitRatio){ return this.nounUnitRatio = nounUnitRatio; } /** * On obtient l'unite des items./Giving unity items * @return le nom de l'unité */ public String getNounUnitRatio(){ return nounUnitRatio; } /** * Prend la valeur interne d'un tag Item/ Put tag Item * @param result * @return */ public String setTagItem(String result){ return this.result = result; } /** * Donne la valeur du tag rechercher/Giving a value of tag seek * @return le String de la valeur rechercher du tag dans un item */ public String getValeurTagItem(){ return result; } /** * Prend la valeur interne d'un tag Item/ Put the value tag iteù * @return */ public Double setTagItemDouble(double result2){ return this.result2 = result2; } /** * Donne la valeur du tag rechercher/Giving the value Tag * @return le Double de la valeur rechercher du tag dans un item */ public Double getValeurTagItemDouble(){ return result2; } /** * reads a String value from tag dicom (dcm4che2) * @param tagNr the Tag to read * @return the value as String * Returns the Specific Character Set defined by Attribute Specific Character Set (0008,0005) * of this or the root Data Set, if this is a Nested Data Set containing in a Sequence Eleme */ public String getHeaderStringValue(int tagNr) { try { Attributes elem = getObject(); elem.setSpecificCharacterSet("GB18030"); String val = elem.getString(tagNr); if (val == null) { val = ""; } return val; } catch (Exception e) { return ""; } } /** * reads a String value from tag dicom (dcm4che2) * @param tagNr the Tag to read * @return the value as String * Returns the Specific Character Set defined by Attribute Specific Character Set (0008,0005) * of this or the root Data Set, if this is a Nested Data Set containing in a Sequence Eleme */ public String[] getHeaderStringValues(int tagNr) { try { System.out.println(222); Attributes elem = getObject(); elem.setSpecificCharacterSet("GB18030"); String[] val = elem.getStrings(tagNr); return val; } catch (Exception e) { return null; } } /** * reads a String value from the Dicomheader * @param tagNr the Tag to read * @param dcmelement * @return the value as String */ public String getHeaderStringValue(Attributes dcmelement, int tagNr) { try { System.out.println(333); /* dcmelement.setSpecificCharacterSet("ISO_IR 100"); */ dcmelement.setSpecificCharacterSet("GB18030"); String val = dcmelement.getString(tagNr); if (val == null) { val = ""; } return val; } catch (Exception e) { return ""; } } /** *reads the tag (group,element) * @param headerNr e.g. "0018,0050" to get Slice Thickness<br> * @return String */ public String getHeaderStringValue(String headerNr) { headerNr = headerNr.replaceAll("xx", "00").replaceAll("XX", "00"); return getHeaderStringValue(toTagInt(headerNr)); } /** * Giving time a tag ("xxxx,") * @param tagNr * @return */ public Time getHeaderTimeValue(String tagNr) { return getHeaderTimeValue(toTagInt(tagNr)); } /** * Giving time a tag * @param tagNr * @return time */ public Time getHeaderTimeValue(int tagNr) { String time = getHeaderStringValue(tagNr); if (time.length() != 6){ return null; } try { int hour = Integer.parseInt(time.substring(0,2)); int min = Integer.parseInt(time.substring(2,4)); int sec = Integer.parseInt(time.substring(4,6)); return new Time(hour,min,sec); } catch (Exception e) { } return null; } /** * retrieves a specific HeaderTag that is inside anotehr tag * or "0008,0102, 0054,0220" to get the Coding Scheme Designator after View Code Sequence * @return String * * @param tagHierarchy; e.g. {Tag.UID, Tag.SOPInstanceUID, Tag.CodeMeaning} * @return */ public String getHeaderValueInsideTag(int[] tagHierarchy) { try { for (int i = 0; i < tagHierarchy.length-1; i++) { return getObject().getString(tagHierarchy[i]); } } catch (Exception e) { String tags = ""; for (int i = 0; i < tagHierarchy.length; i++) { tags += toTagString(tagHierarchy[i]) + " "; } return ""; } return null; } /** * converts the int representation of a header number * e.g. 0x00080010 to the corresponding String 0008,0010 * @return 0008,0010 as String */ public static String toTagString(int tagNr) { return shortToHex(tagNr >> 16) + ',' + shortToHex(tagNr); } public static String shortToHex(int val) { char[] ch = new char[4]; shortToHex(val, ch, 0); return new String(ch); } public static StringBuffer shortToHex(int val, StringBuffer sb) { sb.append(HEX_DIGITS[(val >> 12) & 0xf]); sb.append(HEX_DIGITS[(val >> 8) & 0xf]); sb.append(HEX_DIGITS[(val >> 4) & 0xf]); sb.append(HEX_DIGITS[val & 0xf]); return sb; } public static void shortToHex(int val, char[] ch, int off) { ch[off] = HEX_DIGITS[(val >> 12) & 0xf]; ch[off+1] = HEX_DIGITS[(val >> 8) & 0xf]; ch[off+2] = HEX_DIGITS[(val >> 4) & 0xf]; ch[off+3] = HEX_DIGITS[val & 0xf]; } /** * Create file output dicom * @param fileOutput : file output * @throws IOException * * * Example: * * * * */ public void writeTo(File fileOutput, Attributes fmi, Attributes object) throws IOException { DicomOutputStream dos = new DicomOutputStream( new File (fileOutput +".dcm")); dos.setEncodingOptions(encOpts); dos.writeDataset(fmi, object); dos.finish(); dos.flush(); } /** * Writting * @param fileOutput * @param h * @param w * @throws IOException */ public void writeToSegment(File fileOutput, int h, int w) throws IOException{ DicomOutputStream dos = new DicomOutputStream( new File (fileOutput +".dcm")); dos.setEncodingOptions(encOpts); } /** * Create overlay in pixelData * @param object */ public void overlayCreate(Attributes object){ int position = object.getInt( Tag.OverlayBitPosition, 0 ); if( position == 0 ) { return; } int bit = 1 << position; int[] pixels = object.getInts( Tag.PixelData ); int count = 0; for( int pix : pixels ) { int overlay = pix & bit; pixels[ count++ ] = pix - overlay; } object.setInt( Tag.PixelData, VR.OW, pixels ); } /** * dicom.setString(Tag.PerformingPhysicianName, VR.PN, "Jean"); dicom.setString(Tag.AdmittingDiagnosesDescription, VR.LO, "CHU"); Sequence seq= dicom.newSequence(Tag.AnatomicRegionSequence,0); Attributes dicom2 = new Attributes(); * @param dicom */ public void setItem(Attributes dicom, int TagSequenceName){ Sequence seq= dicom.newSequence(TagSequenceName,0); dicom.setString(Tag.CodingSchemeDesignator, VR.SH, "SRT"); dicom.setString(Tag.CodeValue, VR.SH, "T-AA000"); dicom.setString(Tag.CodeMeaning, VR.LO, "Eye"); seq.add(dicom); } public static void main(String[] args) throws Exception { File file = new File("C:\\Users\\fendo\\Documents\\WeChat Files\\fen_do\\Files\\1234.dcm"); DisplayTag d = new DisplayTag(file); @SuppressWarnings("static-access") Attributes attrs = d.loadDicomObject(file); //输出所有属性信息 System.out.println("所有信息: " + attrs); //获取行 int row = attrs.getInt(Tag.Rows, 1); //获取列 int columns = attrs.getInt(Tag.Columns, 1); //窗宽窗位 float win_center = attrs.getFloat(Tag.WindowCenter, 1); float win_width = attrs.getFloat(Tag.WindowWidth, 1); System.out.println("" + "row=" + row + ",columns=" + row + ",row*columns = " + row * columns); String patientName = attrs.getString(Tag.PatientName, ""); System.out.println("姓名:" + patientName); //生日 String patientBirthDate = attrs.getString(Tag.PatientBirthDate, ""); System.out.println("生日:" + patientBirthDate); //机构 String institution = attrs.getString(Tag.InstitutionName, ""); System.out.println("机构:" + institution); //站点 String station = attrs.getString(Tag.StationName, ""); System.out.println("站点:" + station); //制造商 String Manufacturer = attrs.getString(Tag.Manufacturer, ""); System.out.println("制造商:" + Manufacturer); //制造商模型 String ManufacturerModelName = attrs.getString(Tag.ManufacturerModelName, ""); System.out.println("制造商模型:" + ManufacturerModelName); //描述--心房 String description = attrs.getString(Tag.StudyDescription, ""); System.out.println("描述--心房:" + description); //描述--具体 String SeriesDescription = attrs.getString(Tag.SeriesDescription, ""); System.out.println("描述--具体:" + SeriesDescription); //描述时间 String studyData = attrs.getString(Tag.StudyDate, ""); System.out.println("描述时间:" + studyData); byte[] bytename = attrs.getBytes(Tag.PatientName); System.out.println("姓名: " + new String(bytename,"gb18030")); byte[] bytesex = attrs.getBytes(Tag.PatientSex); System.out.println("性别: " + new String(bytesex,"gb18030")); } }
输出如下:
所有信息: (0008,0005) CS [ISO_IR 100] SpecificCharacterSet
(0008,0008) CS [ORIGINAL\PRIMARY] ImageType
(0008,0016) UI [1.2.840.10008.5.1.4.1.1.1.1] SOPClassUID
(0008,0018) UI [1.2.840.113619.2.203.4.2147483647.1486521160.448521] SOPInstan
(0008,0020) DA [20170208] StudyDate
(0008,0021) DA [20170208] SeriesDate
(0008,0022) DA [20170208] AcquisitionDate
(0008,0023) DA [20170208] ContentDate
(0008,002A) DT [20170208103237.000000] AcquisitionDateTime
(0008,0030) TM [103154.000] StudyTime
(0008,0031) TM [103158.000] SeriesTime
(0008,0032) TM [103237.000] AcquisitionTime
(0008,0033) TM [103240.000] ContentTime
(0008,0050) SH [T77792] AccessionNumber
(0008,0060) CS [DX] Modality
(0008,0068) CS [FOR PRESENTATION] PresentationIntentType
(0008,0070) LO ["GE Healthcare"] Manufacturer
(0008,0080) LO [HeFei RICH] InstitutionName
(0008,0081) ST [Not Initialized
Not Initialized
HeFei
AnHui
Not Initialize(0008,0090) PN [] ReferringPhysicianName
(0008,1010) SH [082407110134] StationName
(0008,1030) LO [ACHEST] StudyDescription
(0008,103E) LO [Chest] SeriesDescription
(0008,1040) LO [Not Initialized] InstitutionalDepartmentName
(0008,1050) PN [] PerformingPhysicianName
(0008,1090) LO ["Definium 6000"] ManufacturerModelName
(0008,1110) SQ [] ReferencedStudySequence
(0008,1120) SQ [] ReferencedPatientSequence
(0008,2112) SQ [1 Items] SourceImageSequence
>Item #1
>(0008,1150) UI [1.2.840.10008.5.1.4.1.1.1.1.1] ReferencedSOPClassUID
>(0008,1155) UI [1.2.840.113619.2.203.4.2147483647.1486521157.927189] Referenc
(0008,2218) SQ [1 Items] AnatomicRegionSequence
>Item #1
>(0008,0100) SH [T-D3000] CodeValue
>(0008,0102) SH [SNM3] CodingSchemeDesignator
>(0008,0104) LO [Chest] CodeMeaning
(0010,0010) PN [zhang^xiao di] PatientName
(0010,0020) LO [T77792] PatientID
(0010,0030) DA [19860618] PatientBirthDate
(0010,0032) TM [] PatientBirthTime
(0010,0040) CS [F] PatientSex
(0010,1010) AS [030Y] PatientAge
(0010,1030) DS [] PatientWeight
(0011,0010) LO [GEMS_GDXE_FALCON_04]
(0011,1003) UI [1.2.840.113619.2.203.4.2147483647.1486521118.562807]
(0011,1004) CS [SE]
(0011,1005) UI [1.2.840.113619.2.203.4.2147483647.1486521152.970120]
(0011,1006) DS [0.083936]
(0011,1009) SL [0]
...
row=2021,columns=2021,row*columns = 4084441
姓名:zhang^xiao di
生日:19860618
机构:HeFei RICH
站点:082407110134
制造商:"GE Healthcare"
制造商模型:"Definium 6000"
描述--心房:ACHEST
描述--具体:Chest
描述时间:20170208
姓名: zhang^xiao di
性别: F
关于“Java怎么实现解析dcm医学影像文件并提取文件信息”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。