【发布时间】:2014-06-03 12:26:36
【问题描述】:
我正在尝试从 PACS 服务器检索 DICOM 图像,我使用 dcmqr.get 获取 DICOM 对象并将其转换为字节数组,当我将 DICOM 对象的字节数组传递给 getPixelDataAsBufferedImage 方法时,它会给出异常 java.lang.ArrayIndexOutOfBoundsException: 0 at line 'buff = reader.read(0, param);'.
我是 DICOM 的新手,不知道到底是什么问题。查询获取 DICOM 是否有问题或将字节数组转换为缓冲图像有任何问题?
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.");
}
【问题讨论】: