首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用dcm4che更改DICOM标记

使用dcm4che更改DICOM标记
EN

Code Review用户
提问于 2015-03-19 20:51:42
回答 1查看 2.3K关注 0票数 1

我被困在了一段使用dcm4che编写的代码上。我已经做了一堆嵌套的ifs,我想找到一种转换为开关用例的方法(问题是我无法声明一个能区分情况的int )。除了让这个代码片段看起来不那么难看之外,还有什么替代方法吗?

代码语言:javascript
复制
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.dcm4che2.data.DicomObject;
import org.dcm4che2.data.Tag;
import org.dcm4che2.data.VR;
import org.dcm4che2.io.DicomInputStream;
import org.dcm4che2.io.DicomOutputStream;
import org.dcm4che2.io.StopTagInputHandler;
import org.dcm4che2.util.CloseUtils;



/**
 * Steps to doing this. 
 * 1.) Read from DCM file and convert to DCM Object
 * 2.) Read from text file 
 * 3.) Add tags to ArrayList
 * 4.) Compare ArrayList of tags to DCM Object
 * 5.) Match tags and associate tags with VR code which will automatically add Strings/values into tag.
 * 6.) Save new copy into a directory prompted by user.
 * @author Ryan
 *
 */
public class changeTags {
    Scanner input = new Scanner(System.in);
    public static DicomObject dcmObj;
    public static ArrayList<String> list = new ArrayList<String>();

    public void promptForTagLocation() throws IOException
    {
        //Turns DCM file into object
        System.out.println("Please Enter DICOM File Location: ");
        String dicomLocation = input.next();
        changeToDICOMObject(dicomLocation);

        //Reading text tag location
        System.out.println("From what TXT File are you reading the tags that need changing: ");
        String tagChangeText = input.next();
        readFromTextFile(tagChangeText);
    }
    public void changeToDICOMObject(String path)
    {
        DicomInputStream din = null;
        try {
            din = new DicomInputStream(new File(path));
            dcmObj = din.readDicomObject();
        }
        catch (IOException e) {
            e.printStackTrace();
            return;
        }
        finally {
            try {
                din.close();
            }
            catch (IOException ignore) {
            }
        }
        System.out.println("Now reading DCM File");
    }
    public void readFromTextFile(String path) throws IOException
    {
        Scanner read = new Scanner(new File(path));
        while (read.hasNext())
        {
            list.add(read.next());
        }
        System.out.println("Reading from tag List....");
        System.out.println("Changing dicom tags...");
        read.close();
        matchTags();
    }
    public void matchTags() throws IOException
    {
        try 
        {
            for(int i = 0; i < list.size(); i++)
            {
                String replaceTag = list.get(i).toString().replaceAll("[(),]", "");
                int valueofReplaceTag = (int)Long.parseUnsignedLong(replaceTag, 16);
                if(dcmObj.vrOf(valueofReplaceTag).equals(VR.DA))
                    {
                        dcmObj.putString(valueofReplaceTag, dcmObj.vrOf(valueofReplaceTag), "20150101");
                    }
                    else if(dcmObj.vrOf(valueofReplaceTag).equals(VR.DT))
                    {
                        dcmObj.putString(valueofReplaceTag, dcmObj.vrOf(valueofReplaceTag), "20150101");
                    }
                    else if(dcmObj.vrOf(valueofReplaceTag).equals(VR.SH))
                    {
                        dcmObj.putString(valueofReplaceTag, dcmObj.vrOf(valueofReplaceTag), "testingThis");
                    }
                    else if(dcmObj.vrOf(valueofReplaceTag).equals(VR.AE))
                    {
                        dcmObj.putString(valueofReplaceTag, dcmObj.vrOf(valueofReplaceTag), "test");
                    }
                    else if(dcmObj.vrOf(valueofReplaceTag).equals(VR.CS))
                    {
                        dcmObj.putString(valueofReplaceTag, dcmObj.vrOf(valueofReplaceTag), "testingThis");
                    }
                    else if(dcmObj.vrOf(valueofReplaceTag).equals(VR.LO))
                    {
                        dcmObj.putString(valueofReplaceTag, dcmObj.vrOf(valueofReplaceTag), "testingThis");
                    }
                    else if(dcmObj.vrOf(valueofReplaceTag).equals(VR.PN))
                    {
                        dcmObj.putString(valueofReplaceTag, dcmObj.vrOf(valueofReplaceTag), "testingThis");
                    }
                    else if(dcmObj.vrOf(valueofReplaceTag).equals(VR.ST))
                    {
                        dcmObj.putString(valueofReplaceTag, dcmObj.vrOf(valueofReplaceTag), "testingThis");
                    }
                    else if(dcmObj.vrOf(valueofReplaceTag).equals(VR.LT))
                    {
                        dcmObj.putString(valueofReplaceTag, dcmObj.vrOf(valueofReplaceTag), "testingThis");
                    }
                    else if(dcmObj.vrOf(valueofReplaceTag).equals(VR.UT))
                    {
                        dcmObj.putString(valueofReplaceTag, dcmObj.vrOf(valueofReplaceTag), "testingThis");
                    }
                    else if(dcmObj.vrOf(valueofReplaceTag).equals(VR.AS))
                    {
                        dcmObj.putString(valueofReplaceTag, dcmObj.vrOf(valueofReplaceTag), "25");
                    }
                    else if(dcmObj.vrOf(valueofReplaceTag).equals(VR.DS))
                    {
                        dcmObj.putString(valueofReplaceTag, dcmObj.vrOf(valueofReplaceTag), "25");
                    }
                    else if(dcmObj.vrOf(valueofReplaceTag).equals(VR.UL))
                    {
                        dcmObj.putInt(valueofReplaceTag, dcmObj.vrOf(valueofReplaceTag), 25);
                    }
                    else if(dcmObj.vrOf(valueofReplaceTag).equals(VR.SL))
                    {
                        dcmObj.putInt(valueofReplaceTag, dcmObj.vrOf(valueofReplaceTag), 25);
                    }
                    else if(dcmObj.vrOf(valueofReplaceTag).equals(VR.TM))
                    {
                        dcmObj.putString(valueofReplaceTag, dcmObj.vrOf(valueofReplaceTag), "22:00");
                    }
            }
                System.out.println("Where is the new DCM file being saved to? Please enter directory (Include File name and Extension): ");
                String directoryPath = input.next();
                File out = new File(directoryPath);
                DicomOutputStream dos = new DicomOutputStream(new BufferedOutputStream(new FileOutputStream(out)));
                dos.writeDicomFile(dcmObj);

                CloseUtils.safeClose(dos);

        System.out.println("Tags have been successfully changed!");
        menu.showMenu();
        }
        catch (NumberFormatException e){
            System.err.println(e);
        }
    }
}
EN

回答 1

Code Review用户

回答已采纳

发布于 2015-04-02 10:59:39

您可以定义替换的映射,如下所示:

代码语言:javascript
复制
private static final Map<VR, String> stringReplacements = new HashedMap<>();
static {
  stringReplacements.put(VR.DA, "20150101");
  stringReplacements.put(VR.DT, "20150101");
  stringReplacements.put(VR.SH, "testingThis");
  // ....
}

private static final Map<VR, Integer> intReplacements = new HashedMap<>();
static {
  intReplacements.put(VR.UL, 25);
  // ....
}

请注意,我已经创建了两个不同的映射,您可以同时替换字符串和ints。您可以有一个Object值映射,但是替换代码需要执行instanceof检查。

然后,您的一系列条件语句减少到:

代码语言:javascript
复制
VR replaceTagVR = dcmObj.vrOf(valueofReplaceTag);

String s = stringReplacements.get(replaceTagVR);
if (s != null) {
  dcmObj.putString(valueofReplaceTag, replaceTagVR, s);
}

Integer i = intReplacements.get(replaceTagVR);
if (i != null) {
  dcmObj.putInt(valueofReplaceTag, replaceTagVR, i);
} 
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/84520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档