目前我正在编写一个模块,用于将JPEG
转换为DICOM Image
转换。在分析时,我已完成标记渲染,现在图像未在DICOM
文件中正确呈现。
是否有任何算法可以将JPEG
转换为DICOM
。
答案 0 :(得分:2)
继续Matthieu的回答,这是一个使用优秀的GDCM库和他引用的例子为JPEG流创建DICOM包络的一种非常简单的方法(注意我使用了一些辅助类,但很简单):
ImageReader r = new ImageReader();
gdcm.Image image = r.GetImage();
image.SetNumberOfDimensions(2);
DataElement pixeldata = DataElementHelper.PixelData;
string file1 = @"D:\testfil.jpeg";
System.IO.FileStream infile =
new System.IO.FileStream(file1, System.IO.FileMode.Open, System.IO.FileAccess.Read);
//uint fsize = gdcm.PosixEmulation.FileSize(file1);
//byte[] jstream = new byte[fsize];
//infile.Read(jstream, 0, jstream.Length);
byte[] jstream = System.IO.File.ReadAllBytes(file1);
uint fsize = (uint) jstream.Length;
SmartPtrFrag sq = SequenceOfFragments.New();
Fragment frag = new Fragment();
frag.SetByteValue(jstream, new gdcm.VL((uint)jstream.Length));
sq.AddFragment(frag);
pixeldata.SetValue(sq.__ref__());
// insert:
image.SetDataElement(pixeldata);
PhotometricInterpretation pi = new PhotometricInterpretation(PhotometricInterpretation.PIType.MONOCHROME2);
image.SetPhotometricInterpretation(pi);
// FIXME hardcoded:
PixelFormat pixeltype = new PixelFormat(PixelFormat.ScalarType.UINT8);
image.SetPixelFormat(pixeltype);
TransferSyntax ts = new TransferSyntax(TransferSyntax.TSType.JPEGBaselineProcess1);
image.SetTransferSyntax(ts);
image.SetDimension(0, (uint)1700);
image.SetDimension(1, (uint)2200);
ImageWriter writer = new ImageWriter();
gdcm.File file = writer.GetFile();
var ds = file.GetDataSet();
DataElement patientID = DataElementHelper.PatientID;
DataElement patientName = DataElementHelper.PatientName;
DataElement accessionNumber = DataElementHelper.AccessionNumber;
DataElement studyDate = DataElementHelper.StudyDate;
DataElement studyTime = DataElementHelper.StudyTime;
DataElement studyInstanceUID = DataElementHelper.StudyInstanceUID;
DataElement seriesInstanceUID = DataElementHelper.SeriesInstanceUID;
DataElement mediaStorage = DataElementHelper.SOPClassUID;
string studyUID = new gdcm.UIDGenerator().Generate();
string seriesUID = new gdcm.UIDGenerator().Generate();
//pixelData.SetArray(b, (uint)b.Length);
DataElementHelper.SetDataElement(ref patientName, "TEST^MARCUS");
DataElementHelper.SetDataElement(ref patientID, "0000000801");
DataElementHelper.SetDataElement(ref accessionNumber, "0000000801-12345");
DataElementHelper.SetDataElement(ref studyDate, DateTime.Now.ToString("yyyyMMdd"));
DataElementHelper.SetDataElement(ref studyTime, DateTime.Now.ToString("HHmmss"));
DataElementHelper.SetDataElement(ref studyInstanceUID, studyUID);
DataElementHelper.SetDataElement(ref seriesInstanceUID, seriesUID);
DataElementHelper.SetDataElement(ref mediaStorage, "1.2.840.10008.5.1.4.1.1.7");
ds.Insert(patientID);
ds.Insert(patientName);
ds.Insert(accessionNumber);
ds.Insert(studyDate);
ds.Insert(studyTime);
ds.Insert(studyInstanceUID);
ds.Insert(seriesInstanceUID);
ds.Insert(mediaStorage);
writer.SetImage(image);
writer.SetFileName("gdcm_test.dcm");
bool ret = writer.Write();
答案 1 :(得分:1)
请查看最初由Colby Dillion编写的mdcm C#DICOM库。他开发了托管C ++“桥接”到IJG/LibJPEG和OpenJPEG代码库,因此mdcm提供8/12/16位有损和无损JPEG支持以及JPEG-2000支持。
Colby的原始库具有WinForms依赖性。我创建了一个Silverlight和WPF目标的mdcm here分支。该库的WPF版本可以充分利用Colby最初实现的相同JPEG(-2000)编解码器 另一方面,Silverlight版本目前无法从这些编解码器中受益。我已尝试将FJCore和LibJpeg.Net库应用于Silverlight中的有损JPEG支持,但这些库目前仅支持8位图像。
的问候,
Anders @ Cureos
答案 2 :(得分:0)
.NET本身没有DICOM支持的功能。您将需要使用库。我不知道有任何免费的,但我已经使用过LeadTools,它会这样做(需要付出代价)。但我只会给它一个4/10,我会重新开始寻找其他选项。
答案 3 :(得分:0)
您无需将JPEG转换为DICOM。 DICOM只是JPEG流的“信封”。以下是我在GDCM中为封装(=放入DICOM信封)现有的MPEG2文件所做的事情:
http://gdcm.sourceforge.net/html/MpegVideoInfo_8cs-example.html
只需将该代码调整为输入JPEG文件即可。例如,看看:
http://gdcm.sourceforge.net/html/DecompressJPEGFile_8cs-example.html
无需解压缩/重新压缩,这将浪费资源。