图像rgb jpg到dom4che3的dicom

时间:2015-03-04 16:03:47

标签: java jpeg dicom dcm4che

我使用了medPhys-pl提出的解决方案,solution jpg to dicom with 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();

1 个答案:

答案 0 :(得分:0)

彩色jpeg有损文件不能是RGB。当你找到一个它通常有一个YBRFULL颜色空间(即使颜色空间标签错误地指定RGB),你应该采取相应的行动。