喵星之旅-狂奔的兔子-使用java实现dcm文件转jpg

由于相关的jar基本直接搞不到,需要自己编译jar。这里提供直接带有jar的项目,免去编译问题,很多时候编译失败。

jar一共需要4个:

dcm4che-core-5.20.0.jar

dcm4che-imageio-5.20.0.jar

dcm4che-image-5.20.0.jar

slf4j-api-1.7.30.jar

如果能拿到这几个jar基本随便百度搜索就能解决了。

代码地址:

svn://www.kittybunny.cn/kitty/2、code/bunny_dcmtool 用户名密码: reader reader

只需要一个主文件即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package club.kittybunny.tool.dcmfile;


import org.dcm4che3.data.Attributes;
import org.dcm4che3.imageio.plugins.dcm.DicomImageReadParam;


import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;

import javax.imageio.stream.ImageInputStream;

import java.awt.image.BufferedImage;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;


public class Dcm2Jpg2 {
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;
/**
* 通过制定源文件目录和目标文件目录,实现dcm转jpg格式
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
//源文件加目录全路径,结尾用/结束,只处理里面dcm格式文件 ,例如"/home/bunny/桌面/src/"
String src = "/home/bunny/Downloads/qq-files/1023354682/file_recv/3000566.000000-03192/";
//目标路径全路径,将源文件加内所有dcm文件转换为同名jpg文件,使用/结束,;例如 "/home/bunny/桌面/w/dcm/"
String out = "/home/bunny/桌面/w/dcm/";
if (args.length >= 2) {
src = args[0];
out = args[1];

}
File f = new File(src);
//读取到所有文件名
String[] arr = f.list();
for (int i = 0; i < arr.length; i++) {
//筛选符合条件的文件处理
if (arr[i].endsWith(".dcm")) {
InputStream in = new FileInputStream(src + arr[i]);

ByteArrayOutputStream byteArrayOutputStream = new Dcm2Jpg2().convert(in, null);
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(out + arr[i].substring(0, arr[i].lastIndexOf("."))+".jpg");
fileOutputStream.write(byteArrayOutputStream.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}

}
}

}

/**
*
* 实现单文件的dcm转jpg
* @param src dcm文件流
* @param name oss的getFileName
* @throws Exception
*/
public ByteArrayOutputStream convert(InputStream src, String name) throws Exception {
Iterator<ImageReader> iter = ImageIO.getImageReadersByFormatName("DICOM");
ImageReader reader = iter.next();
try (ImageInputStream iis = ImageIO.createImageInputStream(src)) {
reader.setInput(iis, false);
BufferedImage bi = readImage(iis);
if (bi == null) {
throw new Exception("无法读取到图片");
}
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(bi, "jpg", os);

return os;

} catch (IOException e) {
e.printStackTrace();
return null;
}
}

private ImageReadParam readParam() {
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());
}
}

附带可执行jar的说明文件:

先将需要转换的dcm文件统一放到一个文件夹内,然后创建转换后文件的文件夹,文件夹全路径不能有空格。
执行命令例如:
java -jar dcm2jpg.jar /home/bunny/Downloads/qq-files/1023354682/file_recv/3000566.000000-03192/ /home/bunny/桌面/w/new/

其中第一个参数是源文件所在目录。
第二个参数是转换后文件艘在目录。
所有目录需要“/”结尾。

上面示例,命令中
“/home/bunny/Downloads/qq-files/1023354682/file_recv/3000566.000000-03192/“是原文件所在目录;
“/home/bunny/桌面/w/new/“ 是转换后文件所在目录。

文章目录
|