生活随笔
收集整理的這篇文章主要介紹了
                                
封装多帧dicm图像
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
 
                                
                            
                            
                            原文是(https://stackoverflow.com/questions/40482993/creation-of-multi-frame-dicom-image-using-dcm4che3java)
 因為dcm4che2版本的jar包已經無法下載了,所以我直接把dcm4che2的class類復制到了項目中。
 
package yd
.jpg2dcmbyJava
.dcm2
.test
;import java
.awt
.image
.BufferedImage
;
import java
.io
.File
;
import java
.io
.IOException
;
import java
.util
.UUID
;import javax
.imageio
.IIOImage
;
import javax
.imageio
.ImageIO
;
import javax
.imageio
.ImageWriter
;
import javax
.imageio
.stream
.FileImageOutputStream
;import yd
.jpg2dcmbyJava
.dcm2
.data
.BasicDicomObject
;
import yd
.jpg2dcmbyJava
.dcm2
.data
.DicomObject
;
import yd
.jpg2dcmbyJava
.dcm2
.data
.Tag
;
import yd
.jpg2dcmbyJava
.dcm2
.data
.UID
;
import yd
.jpg2dcmbyJava
.dcm2
.data
.VR
;
import yd
.jpg2dcmbyJava
.dcm2
.image
.DicomImageWriterSpi
;
import yd
.jpg2dcmbyJava
.dcm2
.image
.DicomStreamMetaData
;
import yd
.jpg2dcmbyJava
.dcm2
.util
.UIDUtils
;
public class Mpeg2Dicom {public Mpeg2Dicom() {}public DicomObject 
createDicomHeader(BufferedImage sampleFrame
, int numberOfFrames
) {int colorComponents 
= sampleFrame
.getColorModel().getNumColorComponents();int bitsPerPixel 
= sampleFrame
.getColorModel().getPixelSize();int bitsAllocated 
= (bitsPerPixel 
/ colorComponents
);int samplesPerPixel 
= colorComponents
;DicomObject dicom 
= new BasicDicomObject();dicom
.putString(Tag
.PatientName
, VR
.PN
, "dxy");dicom
.putString(Tag
.PatientID
, VR
.LO
, "1234ID");dicom
.putDate(Tag
.PatientBirthDate
, VR
.DA
, new java.util.Date());dicom
.putString(Tag
.PatientSex
, VR
.CS
, "M");dicom
.putString(Tag
.StudyID
, VR
.SH
, "1");dicom
.putString(Tag
.StudyDescription
, VR
.LO
, "MULTIFRAME STUDY");dicom
.putDate(Tag
.StudyDate
, VR
.DA
, new java.util.Date());dicom
.putDate(Tag
.StudyTime
, VR
.TM
, new java.util.Date());dicom
.putInt(Tag
.SeriesNumber
, VR
.IS
, 1);dicom
.putDate(Tag
.SeriesDate
, VR
.DA
, new java.util.Date());dicom
.putDate(Tag
.SeriesTime
, VR
.TM
, new java.util.Date());dicom
.putString(Tag
.SeriesDescription
, VR
.LO
, "MULTIFRAME SERIES"); dicom
.putString(Tag
.Modality
, VR
.CS
, "SC"); dicom
.putInt(Tag
.InstanceNumber
, VR
.IS
, 1);dicom
.putInt(Tag
.SamplesPerPixel
, VR
.US
, samplesPerPixel
); dicom
.putString(Tag
.PhotometricInterpretation
, VR
.CS
, "RGB"); dicom
.putInt(Tag
.Rows
, VR
.US
, sampleFrame
.getHeight());dicom
.putInt(Tag
.Columns
, VR
.US
, sampleFrame
.getWidth());dicom
.putInt(Tag
.BitsAllocated
, VR
.US
, bitsAllocated
);dicom
.putInt(Tag
.BitsStored
, VR
.US
, bitsAllocated
);dicom
.putInt(Tag
.HighBit
, VR
.US
, bitsAllocated
-1);dicom
.putInt(Tag
.PixelRepresentation
, VR
.US
, 0); dicom
.putString(Tag
.SOPClassUID
, VR
.UI
, UID
.SecondaryCaptureImageStorage
);dicom
.putString(Tag
.StudyInstanceUID
, VR
.UI
, UIDUtils
.createUID());dicom
.putString(Tag
.SeriesInstanceUID
, VR
.UI
, UIDUtils
.createUID());dicom
.putString(Tag
.SOPInstanceUID
, VR
.UI
, UIDUtils
.createUID());dicom
.putInt(Tag
.StartTrim
, VR
.IS
, 1);                   dicom
.putInt(Tag
.StopTrim
, VR
.IS
, numberOfFrames
);       dicom
.putString(Tag
.FrameTime
, VR
.DS
, "33.33");          dicom
.putString(Tag
.FrameDelay
, VR
.DS
, "0.0");           dicom
.putInt(Tag
.NumberOfFrames
, VR
.IS
, numberOfFrames
); dicom
.putInt(Tag
.RecommendedDisplayFrameRate
, VR
.IS
, 3); dicom
.putInt(Tag
.FrameIncrementPointer
, VR
.AT
, Tag
.FrameTime
);dicom
.putString(Tag
.SpecificCharacterSet
, VR
.CS
, "ISO_IR 100");dicom
.putString(Tag
.TransferSyntaxUID
, VR
.UI
, "1.2.840.10008.1.2.1");dicom
.putInt(Tag
.NumberOfFrames
, VR
.IS
, 4);return dicom
;}public void encodeMultiframe(File
[] frames
, File dest
) throws IOException 
{System
.out
.println("Creating Multiframe File...");ImageWriter writer 
= new DicomImageWriterSpi().createWriterInstance();FileImageOutputStream output 
= new FileImageOutputStream(dest
);writer
.setOutput(output
);BufferedImage sample 
= ImageIO
.read(frames
[0]);DicomObject ds 
= this.createDicomHeader(sample
, frames
.length
);DicomStreamMetaData writeMeta 
= (DicomStreamMetaData
) writer
.getDefaultStreamMetadata(null
);writeMeta
.setDicomObject(ds
);writer
.prepareWriteSequence(writeMeta
);System
.out
.println("Start of Write Sequence...");for (int i 
= 0; i 
< frames
.length
; i
++) {System
.out
.println("Encoding frame # "+ (i
+1));BufferedImage frame 
= ImageIO
.read(frames
[i
]);IIOImage iioimage 
= new IIOImage(frame
, null
, null
);System
.out
.println("iioimage"+iioimage
);writer
.writeToSequence(iioimage
, null
);}System
.out
.println("End of Write Sequence.");writer
.endWriteSequence();output
.close();System
.out
.println("Multiframe File Created.");}public static void main(String
[] args
) { try {Mpeg2Dicom f 
= new Mpeg2Dicom();File
[] frames 
= new File("H://img//testBmp").listFiles();UUID id
=UUID
.randomUUID();f
.encodeMultiframe(frames
, new File("H://img//img3.dcm"));} catch (Exception e
) {e
.printStackTrace();}}
}
                            總結
                            
                                以上是生活随笔為你收集整理的封装多帧dicm图像的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。