Я использовал решение, предложенное medPhys-pl, solution jpg to dicom with dcm4che3.images rgb jpg to dicom с dcm4che3
Я пытаюсь преобразовать файл jpg в файл dicom. когда jpg является монохромным, мой код завершен, однако если файл jpg равен RGB, файл dicom имеет цвета, измененные относительно исходного изображения.
Кто-нибудь знает причину ???
благодаря
File fileJpg = new File(path + "tmp_" + numImagen + ".jpg");
File fileDicomFinal = new File(path + "tmp_" + numImagen + ".dcm");
File fileDicomOrig = new File(cabeceraOriginal);
File fileDicomTipo = new File(cabeceraTipo);
BufferedImage jpg = ImageIO.read(fileJpg);
//Convert the image to a byte array
DataBufferByte buff = (DataBufferByte) jpg.getData().getDataBuffer();
byte[] buffbytes = buff.getData(0);
byte[] b = new byte[5*buff.getData(0).length];
for (int j = 0; j < 5; j++) {
System.arraycopy(buffbytes, 0, b, j*buffbytes.length, buffbytes.length);
}
//Copy a header
DicomInputStream dis = new DicomInputStream(fileDicomTipo);
Attributes meta = dis.readFileMetaInformation();
Attributes attribs = dis.readDataset(-1, Tag.PixelData);
dis.close();
DicomInputStream disOrig = new DicomInputStream(fileDicomOrig);
Attributes attribsOrig = disOrig.readDataset(-1, Tag.PixelData);
disOrig.close();
//get properties of image
int colorComponents = jpg.getColorModel().getNumColorComponents();
int bitsPerPixel = jpg.getColorModel().getPixelSize();
int bitsAllocated = (bitsPerPixel/colorComponents);
int samplesPerPixel = colorComponents;
//Change the rows and columns
attribs.setString(Tag.SpecificCharacterSet, VR.CS, "ISO_IR 100");
attribs.setString(Tag.PhotometricInterpretation, VR.CS, samplesPerPixel == 3 ? "RGB" : "MONOCHROME2");
attribs.setInt(Tag.SamplesPerPixel, VR.US, samplesPerPixel);
attribs.setInt(Tag.Rows, VR.US, jpg.getHeight());
attribs.setInt(Tag.Columns, VR.US, jpg.getWidth());
attribs.setInt(Tag.BitsAllocated, VR.US, bitsAllocated);
attribs.setInt(Tag.BitsStored, VR.US, bitsAllocated);
attribs.setInt(Tag.HighBit, VR.US, bitsAllocated-1);
attribs.setInt(Tag.PixelRepresentation, VR.US, 0);
/*Also, our Dicom header needs information about date and time of creation:*/
attribs.setDate(Tag.InstanceCreationDate, VR.DA, new Date());
attribs.setDate(Tag.InstanceCreationTime, VR.TM, new Date());
/* Every Dicom file has a unique identifier.
* Here we’re generating study, series and Sop instances UIDs.
* You may want to modify these values, but you should to care about their uniqueness.
*/
attribs.setString(Tag.SeriesInstanceUID, VR.UI, UIDUtils.createUID();
attribs.setString(Tag.SOPInstanceUID, VR.UI, UIDUtils.createUID());
attribs.setString(Tag.StudyInstanceUID, VR.UI, UIDUtils.createUID());
attribs.setString(Tag.AccessionNumber, VR.IS, attribsOrig.getString(Tag.AccessionNumber));
attribs.setString(Tag.PatientName, VR.CS, attribsOrig.getString(Tag.PatientName));
attribs.setString(Tag.InstitutionName, VR.CS, attribsOrig.getString(Tag.InstitutionName));
attribs.setString(Tag.PatientID, VR.CS, attribsOrig.getString(Tag.PatientID));
attribs.setString(Tag.PatientBirthDate, VR.DT, attribsOrig.getString(Tag.PatientBirthDate));
attribs.setString(Tag.PatientSex, VR.CS, attribsOrig.getString(Tag.PatientSex));
attribs.setString(Tag.OtherPatientIDs, VR.CS, attribsOrig.getString(Tag.OtherPatientIDs));
attribs.setString(Tag.PatientAge, VR.AS, attribsOrig.getString(Tag.PatientAge));
attribs.setString(Tag.AcquisitionDateTime, VR.DT, attribsOrig.getString(Tag.AcquisitionDateTime));
attribs.setString(Tag.AcquisitionDate, VR.DT, attribsOrig.getString(Tag.AcquisitionDate));
attribs.setString(Tag.AcquisitionTime, VR.DT, attribsOrig.getString(Tag.AcquisitionTime));
attribs.setString(Tag.StudyInstanceUID , VR.UI, attribsOrig.getString(Tag.StudyInstanceUID));
//Write the file
attribs.setBytes(Tag.PixelData, VR.OW, b);
DicomOutputStream dcmo = new DicomOutputStream(fileDicomFinal);
dcmo.writeFileMetaInformation(meta);
attribs.writeTo(dcmo);
dcmo.close();
Что вы пробовали? Выполнили свой код и попытались увидеть, где вещи меняются? – NathanOliver
Я пытаюсь преобразовать файл jpg в файл dicom. когда jpg является монохромным, мой код завершен, однако если файл jpg равен RGB, файл dicom имеет цвета, измененные относительно исходного изображения. –
Откуда появляется ваш jpeg? У вас установлены кодеки jai imageio или вы используете кодеки jpeg из jre? Создатель jpeg-изображения в ire имеет дефект с определенными типами метаданных, которые могут повредить цвета: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6243376 –