import org.itk.simple.*;
import java.io.*;
import java.util.*;
import java.text.SimpleDateFormat;
import java.nio.*;
public class DicomSeriesFromArray {
private static ImageFileWriter writer = new ImageFileWriter();
static void writeSlices(List<String[]> seriesTag, Image inImage, String outDir, int i) throws Exception {
SliceImageFilter sliceFilter = new SliceImageFilter();
sliceFilter.setStart(new VectorInt32(new int[]{0,0,i}));
sliceFilter.setStep(1);
sliceFilter.setStop(new VectorInt32(new int[]{0,0,i+1}));
Image imageSlice = sliceFilter.execute(inImage);
for (String[] tagValue : seriesTag) {
imageSlice.setMetaData(tagValue[0], tagValue[1]);
}
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat timeFormat = new SimpleDateFormat("HHmmss");
Date now = new Date();
imageSlice.setMetaData("0008|0012", dateFormat.format(now));
imageSlice.setMetaData("0008|0013", timeFormat.format(now));
imageSlice.setMetaData("0008|0060", "CT");
VectorDouble position = inImage.transformIndexToPhysicalPoint(new VectorInt64(new long[]{0,0,i}));
StringJoiner posJoiner = new StringJoiner("\\");
for (int j = 0; j < position.size(); j++) {
posJoiner.add(String.valueOf(position.get(j)));
}
imageSlice.setMetaData("0020|0032", posJoiner.toString());
imageSlice.setMetaData("0020|0013", String.valueOf(i));
writer.setFileName(new File(outDir, i + ".dcm").getAbsolutePath());
writer.execute(imageSlice);
}
public static void main(String[] args) throws Exception {
if (args.length < 1) {
System.out.println("Usage: DicomSeriesFromArray <output_directory>");
System.exit(1);
}
PixelIDValueEnum pixelType = PixelIDValueEnum.sitkInt16;
VectorUInt32 imageSize = new VectorUInt32();
imageSize.add(512);
imageSize.add(512);
imageSize.add(256);
int totalPixels = 512 * 512 * 256;
Random rand = new Random();
Image newImg;
if (pixelType == PixelIDValueEnum.sitkInt16) {
short[] randomData = new short[totalPixels];
for (int i = 0; i < totalPixels; i++) {
randomData[i] = (short)(rand.nextInt(2001) - 1000);
}
newImg = SimpleITK.importAsInt16(randomData, imageSize);
} else if (pixelType == PixelIDValueEnum.sitkFloat64) {
double[] randomData = new double[totalPixels];
for (int i = 0; i < totalPixels; i++) {
randomData[i] = (rand.nextDouble() * 2000.0) - 1000.0;
}
newImg = SimpleITK.importAsFloat64(randomData, imageSize);
} else {
throw new IllegalArgumentException("Unsupported pixel type");
}
newImg.setSpacing(new VectorDouble(new double[]{2.5, 3.5, 4.5}));
writer.keepOriginalImageUIDOn();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat timeFormat = new SimpleDateFormat("HHmmss");
Date now = new Date();
String modificationTime = timeFormat.format(now);
String modificationDate = dateFormat.format(now);
VectorDouble direction = newImg.getDirection();
List<String[]> seriesTagValues = new ArrayList<>();
seriesTagValues.add(new String[]{"0008|0031", modificationTime});
seriesTagValues.add(new String[]{"0008|0021", modificationDate});
seriesTagValues.add(new String[]{"0008|0008", "DERIVED\\SECONDARY"});
seriesTagValues.add(new String[]{"0020|000e", "1.2.826.0.1.3680043.2.1125." + modificationDate + ".1" + modificationTime});
String orientation = String.format("%f\\%f\\%f\\%f\\%f\\%f",
direction.get(0), direction.get(3), direction.get(6),
direction.get(1), direction.get(4), direction.get(7));
seriesTagValues.add(new String[]{"0020|0037", orientation});
seriesTagValues.add(new String[]{"0008|103e", "Created-SimpleITK"});
if (pixelType == PixelIDValueEnum.sitkFloat64) {
double rescaleSlope = 0.001;
seriesTagValues.add(new String[]{"0028|1053", String.valueOf(rescaleSlope)});
seriesTagValues.add(new String[]{"0028|1052", "0"});
seriesTagValues.add(new String[]{"0028|0100", "16"});
seriesTagValues.add(new String[]{"0028|0101", "16"});
seriesTagValues.add(new String[]{"0028|0102", "15"});
seriesTagValues.add(new String[]{"0028|0103", "1"});
}
for (int i = 0; i < newImg.getDepth(); i++) {
writeSlices(seriesTagValues, newImg, args[0], i);
}
String dataDirectory = args[0];
VectorString seriesIDs = ImageSeriesReader.getGDCMSeriesIDs(dataDirectory);
if (seriesIDs.size() == 0) {
System.out.println("ERROR: given directory \"" + dataDirectory + "\" does not contain a DICOM series.");
System.exit(1);
}
VectorString seriesFileNames = ImageSeriesReader.getGDCMSeriesFileNames(dataDirectory, seriesIDs.get(0));
ImageSeriesReader seriesReader = new ImageSeriesReader();
seriesReader.setFileNames(seriesFileNames);
seriesReader.loadPrivateTagsOn();
Image image3D = seriesReader.execute();
VectorDouble readSpacing = image3D.getSpacing();
VectorDouble originalSpacing = newImg.getSpacing();
System.out.printf("[%f, %f, %f] vs [%f, %f, %f]%n",
readSpacing.get(0), readSpacing.get(1), readSpacing.get(2),
originalSpacing.get(0), originalSpacing.get(1), originalSpacing.get(2));
}
}