Dicom文件批量轉換爲Bmp文件(C#)

簡介

有一個dicom數據的文件夾,遍歷訪問這個文件夾中的dicom文件,然後對dicom文件進行讀取和轉換爲bmp文件

源碼

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing;
using Dicom;
using Dicom.Imaging;
using Dicom.Imaging.Codec;
using System.Runtime.InteropServices;

namespace DicomToBmp
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @"C:\Users\twj83\Desktop\image_dicom\Dicom圖片數據\腿部";  //存放dicom數據的文件夾路徑
            DirectoryInfo root = new DirectoryInfo(path);
            foreach (FileInfo f in root.GetFiles())//遍歷文件夾下的每個文件
            {
                string filename = path+ "\\" + f.Name;     //得到單個文件的filename,自己進行相關操作
                Program pro = new Program();
                //MessageBox.Show(filename);
                pro.ShowAndDrawingDCMImage(filename, f.Name);
            }
            MessageBox.Show("轉換完成");
        }

        private void ShowAndDrawingDCMImage(string dcmFileName, string filename)
        {

            try
            {
                DicomFile dcmFile = DicomFile.Open(dcmFileName);
                //Load and Show the meta info of the DCM file
                LoadAndShowDCMMetaInfo(dcmFile);    //讀取dicom文件
                //Drawing the image in your DCM file to screen.
                ConvertDCMData2BitImage(dcmFile, filename);  //轉換爲bmp圖像
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
                return;
            }
        }

        private void LoadAndShowDCMMetaInfo(DicomFile dcm)
        {
            //Show the message of DCM file to the listview in the dialog.
            DicomDataset dcmDataset = dcm.Dataset;
            DicomFileMetaInformation dcmMetaInfo = dcm.FileMetaInfo;
       
            //DICOM MetaInfo
            //下列代碼是獲取dicom文件包含的信息,然後寫入txt文檔裏
            //System.IO.File.WriteAllText(@"D:\fo-dicom.txt", string.Empty);         //清空txt文檔
            //using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"D:\fo-dicom.txt", true))  //打開txt文檔寫入信息
            //{
            //    file.WriteLine("0002 " + "0002 " + dcmMetaInfo.MediaStorageSOPClassUID.ToString());
            //    file.WriteLine("0002 " + "0003 " + dcmMetaInfo.MediaStorageSOPInstanceUID.ToString());
            //    file.WriteLine("0002 " + "0010 " + dcmMetaInfo.TransferSyntax.ToString());
            //    file.WriteLine("0002 " + "0012 " + dcmMetaInfo.ImplementationClassUID.ToString());
            //    file.WriteLine("0002 " + "0013 " + dcmMetaInfo.ImplementationVersionName.ToString());
            //    file.WriteLine("0010 " + "0010 " + dcmDataset.Get<string>(DicomTag.PatientName, ""));
            //    file.WriteLine("0010 " + "0020 " + dcmDataset.Get<string>(DicomTag.PatientID, ""));
            //    file.WriteLine("0010 " + "0030 " + dcmDataset.Get<string>(DicomTag.PatientBirthDate));
            //    file.WriteLine("0010 " + "0040 " + dcmDataset.Get<string>(DicomTag.PatientSex));
            //    file.WriteLine("0010 " + "1010 " + dcmDataset.Get<string>(DicomTag.PatientAge));
            //    file.WriteLine("0008 " + "0020 " + dcmDataset.Get<string>(DicomTag.StudyDate));
            //    file.WriteLine("0008 " + "0030 " + dcmDataset.Get<string>(DicomTag.StudyTime));
            //    file.WriteLine("0020 " + "000D " + dcmDataset.Get<string>(DicomTag.StudyInstanceUID));
            //    file.WriteLine("0020 " + "000E " + dcmDataset.Get<string>(DicomTag.SeriesInstanceUID));
            //    file.WriteLine("0020 " + "0010 " + dcmDataset.Get<string>(DicomTag.StudyID));
            //    file.WriteLine("0028 " + "0010 " + dcmDataset.Get<string>(DicomTag.Rows));
            //    file.WriteLine("0028 " + "0011 " + dcmDataset.Get<string>(DicomTag.Columns));
            //    file.WriteLine("0028 " + "0100 " + dcmDataset.Get<string>(DicomTag.BitsAllocated));
            //    file.WriteLine("0028 " + "0101 " + dcmDataset.Get<string>(DicomTag.BitsStored));
            //    file.WriteLine("0028 " + "0102 " + dcmDataset.Get<string>(DicomTag.HighBit));
            //}
        }

        private Bitmap ConvertDCMData2BitImage(DicomFile dcm, string filename)
        {
            DicomFile newDcmFile = null;
            if (dcm.FileMetaInfo.TransferSyntax.IsEncapsulated)//if the data is compressed
            {
                // System.Reflection.Assembly.LoadFrom(Path.Combine(Application.StartupPath,"Dicom.Native64.dll"));
                DicomTranscoder.LoadCodecs(Application.StartupPath, "Dicom.Native*.dll");
                newDcmFile = dcm.ChangeTransferSyntax(DicomTransferSyntax.ExplicitVRLittleEndian, new DicomJpegLsParams());
            }
            DicomImage imageDcm = null;
            if (newDcmFile != null)
                imageDcm = new DicomImage(newDcmFile.Dataset);
            else
                imageDcm = new DicomImage(dcm.Dataset);
            DicomDataset dataset = dcm.Dataset;
            byte[] fs = imageDcm.PixelData.NumberOfFrames < 2 ? imageDcm.PixelData.GetFrame(0).Data : imageDcm.PixelData.GetFrame(1).Data;
            uint size = (uint)Marshal.SizeOf(typeof(short));
            uint padding = (uint)fs.Length % size;
            uint count = (uint)fs.Length / size;
            short[] values = new short[count];
            System.Buffer.BlockCopy(fs, 0, values, 0, (int)(fs.Length - padding));

            int height = dataset.Get<int>(DicomTag.Rows);
            int width = dataset.Get<int>(DicomTag.Columns);
            int windowsWidth = (int)dataset.Get<double>(DicomTag.WindowWidth);
            int windowsCenter = (int)dataset.Get<double>(DicomTag.WindowCenter);
            //if the windowsWidth = 0, the DCM file is not standard type.
            if (windowsWidth == 0 || windowsCenter == 0)
            {
                windowsWidth = values.Max<short>() - values.Min<short>();
                windowsCenter = windowsWidth / 2;
            }
            int low = windowsCenter - windowsWidth / 2;
            int high = windowsCenter + windowsWidth / 2;
            Bitmap bitmap = new Bitmap(width, height);
            for (int i = 0; i < height; ++i)
            {
                for (int j = 0; j < width; ++j)
                {
                    int r, g, b;
                    int temp = (int)values[(width - j - 1) * height + i];
                    int val = temp > high ? 255 : (temp < low ? 0 : ((temp - low) * 255 / windowsWidth));
                    r = g = b = val;
                    bitmap.SetPixel(i, width - j - 1, Color.FromArgb(r, g, b));
                }
            }
            string pathdicom = "D:\\bmp\\" + filename.Substring(0, filename.Length - 3) + "bmp";
            bitmap.Save(pathdicom, System.Drawing.Imaging.ImageFormat.Bmp);        //保存bmp文件到本地
            return bitmap;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章