2015-03-04 2 views
0

Я использовал решение, предложенное 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(); 
+0

Что вы пробовали? Выполнили свой код и попытались увидеть, где вещи меняются? – NathanOliver

+0

Я пытаюсь преобразовать файл jpg в файл dicom. когда jpg является монохромным, мой код завершен, однако если файл jpg равен RGB, файл dicom имеет цвета, измененные относительно исходного изображения. –

+0

Откуда появляется ваш jpeg? У вас установлены кодеки jai imageio или вы используете кодеки jpeg из jre? Создатель jpeg-изображения в ire имеет дефект с определенными типами метаданных, которые могут повредить цвета: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6243376 –

ответ

0

Цвет JPEG с потерями файл не может быть RGB. Когда вы его находите, у него обычно есть YBRFULL цветовое пространство (даже если тег цветового пространства ошибочно указывает RGB), и вы должны действовать соответствующим образом.

+0

Когда я меняю эту строку: attribs.setString (Tag.PhotometricInterpretation, VR.CS, samplesPerPixel == 3? "RGB": "MONOCHROME2"); для: attribs.setString (Tag.PhotometricInterpretation, VR.CS, samplesPerPixel == 3? "YBR_FULL_422": "MONOCHROME2"); В результате получается файл dicom с изображением, покрытым розовым слоем :( –