C# 如何使用C语言将普通jpeg图像字节转换为DICOM本机图像字节#

C# 如何使用C语言将普通jpeg图像字节转换为DICOM本机图像字节#,c#,jpeg,dicom,image-conversion,C#,Jpeg,Dicom,Image Conversion,目前我正在编写一个模块,用于将JPEG转换为DICOM图像转换。经过分析,我已经完成了标记渲染,现在图像未在DICOM文件中正确渲染 是否有任何算法可以将JPEG转换为DICOM在.NET本身没有支持DICOM的功能。你需要使用图书馆。我不知道有没有免费的,但我用过LeadTools,它会这样做的(收费)。但是我只会给它打4/10分,我会建议你也去寻找其他的选择。请看一下C#DICOM库,它最初由Colby Dillion编写。他已经开发了管理C++的“桥”到代码库,因此,MCMM提供了8/12

目前我正在编写一个模块,用于将
JPEG
转换为
DICOM图像
转换。经过分析,我已经完成了标记渲染,现在图像未在
DICOM
文件中正确渲染


是否有任何算法可以将
JPEG
转换为
DICOM

在.NET本身没有支持DICOM的功能。你需要使用图书馆。我不知道有没有免费的,但我用过LeadTools,它会这样做的(收费)。但是我只会给它打4/10分,我会建议你也去寻找其他的选择。

请看一下C#DICOM库,它最初由Colby Dillion编写。他已经开发了管理C++的“桥”到代码库,因此,MCMM提供了8/12位/ 16位有损和JPEG无损支持以及JPEG-2000支持。 Colby的原始库具有WinForms依赖项。我已经创建了一个针对Silverlight和WPF的mdcm分支。该库的WPF版本可以充分利用Colby最初实现的相同JPEG(-2000)编解码器。
另一方面,Silverlight版本目前无法从这些编解码器中获益。我曾尝试在Silverlight中应用和库以支持有损JPEG,但这些库目前仅支持8位图像

问候,

Anders@Cureos

您不需要将JPEG“转换”为DICOM。DICOM只是JPEG流的“信封”。以下是我在GDCM中封装(=放入DICOM信封)现有MPEG2文件的步骤:

只需将该代码改编为输入JPEG文件。例如,看看:


无需解压缩/重新压缩,这将浪费资源。

继续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();