I am trying to retrieve DICOM images from PACS server, I get DICOM object using dcmqr.get
and convert it to byte array, and when I pass byte array of DICOM object to getPixelDataAsBufferedImage
method its gives exception java.lang.ArrayIndexOutOfBoundsException: 0 at line 'buff = reader.read(0, param);'.
I am very new in DICOM, not getting exactly what is the issue. Is there any problem in making query to get DICOM or any problem in converting byte array to buffered image ?
public class TestDCM {
public static DcmQR dcmqr;
public static void main(String[] args) {
dcmqr = new DcmQR("DCM4CHEE");
dcmqr.setCalledAET("DCM4CHEE", true);
dcmqr.setRemoteHost("IP address");
dcmqr.setRemotePort(11112);
dcmqr.setDateTimeMatching(true);
//dcmqr.setCFind(true);
dcmqr.setCGet(true);
dcmqr.configureTransferCapability(true);
dcmqr.setQueryLevel(DcmQR.QueryRetrieveLevel.IMAGE);
dcmqr.addMatchingKey(Tag.toTagPath("SOPClassUID"),
"1.2.840.10008.5.1.4.1.1.12.2");
List<DicomObject> result = null;
byte[] imgTab = null;
BufferedImage bImage = null;
try {
dcmqr.start();
System.out.println("started");
dcmqr.open();
System.out.println("opened");
result = dcmqr.query();
System.out.println("queried");
dcmqr.get(result);
System.out.println("List Size = " + result.size());
for (DicomObject dco : result) {
dco.putString(Tag.TransferSyntaxUID, VR.UI,UID.ImplicitVRLittleEndian);
// convert dicom object to byte array
imgTab = toByteArray(dco);
// convert byte array to BufferedImage
bImage = getPixelDataAsBufferedImage(imgTab);
File file = new File("filepath.jpg");
writeBufferedImage(file, bImage);
}
} catch (Exception e) {
e.printStackTrace();
}
try {
if (dcmqr != null) {
dcmqr.stop();
dcmqr.close();
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("done");
}
}
// toByteArray method
public static byte[] toByteArray(DicomObject obj) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(baos);
DicomOutputStream dos = new DicomOutputStream(bos);
dos.writeDicomFile(obj);
dos.close();
byte[] data = baos.toByteArray();
return data;
}
//getPixelDataAsBufferedImage method
public static BufferedImage getPixelDataAsBufferedImage(byte[] dicomData)
throws IOException {
ByteArrayInputStream bais = new ByteArrayInputStream(dicomData);
BufferedImage buff = null;
Iterator<ImageReader> iter = ImageIO
.getImageReadersByFormatName("DICOM");
ImageReader reader = (ImageReader) iter.next();
DicomImageReadParam param = (DicomImageReadParam) reader
.getDefaultReadParam();
ImageInputStream iis = ImageIO.createImageInputStream(bais);
reader.setInput(iis, false);
buff = reader.read(0, param);
iis.close();
if (buff == null)
throw new IOException(
"Could not read Dicom file. Maybe pixel data is invalid.");
return buff;
}
//writeBufferedImage method
public static void writeBufferedImage(File file , BufferedImage bufferedImage){
try {
ImageIO.write(bufferedImage, "jpg", file);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Jpeg image created successfully.");
}