Advertisement
Guest User

Untitled

a guest
Mar 20th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.72 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Drawing;
  7. using EvilDicom;
  8. using System.Drawing.Imaging;
  9.  
  10. namespace SevKavTomograf.Inner_Class
  11. {
  12.     class DCMReader
  13.     {
  14.  
  15.         string Name;
  16.  
  17.         ushort Rows,
  18.                Collums,
  19.                Samples_Per_Pixel,
  20.                Bits_Allocated,
  21.                Bits_Stored,
  22.                Pixel_Representation;
  23.  
  24.         byte[] Pixel_Data;
  25.  
  26.         private void ReadDicomFile(string Path)
  27.         {
  28.             EvilDicom.Components.DICOMFile dcmf = new EvilDicom.Components.DICOMFile(Path);
  29.             EvilDicom.Components.DICOMElement dICOMElement = new EvilDicom.Components.DICOMElement();
  30.  
  31.             var tName = dcmf.Find(EvilDicom.Helper.TagHelper.PATIENT_NAME) as EvilDicom.VR.PersonsName;
  32.             Name = tName.Data;
  33.  
  34.             var tCollums = dcmf.Find(EvilDicom.Helper.TagHelper.COLUMNS) as EvilDicom.VR.UnsignedShort;
  35.             Collums = tCollums.Data;
  36.             var trows = dcmf.Find(EvilDicom.Helper.TagHelper.ROWS) as EvilDicom.VR.UnsignedShort;
  37.             Rows = trows.Data;
  38.  
  39.             var tspp = dcmf.Find(EvilDicom.Helper.TagHelper.SAMPLES_PER_PIXEL) as EvilDicom.VR.UnsignedShort;
  40.             Samples_Per_Pixel = tspp.Data;
  41.  
  42.             var tba = dcmf.Find(EvilDicom.Helper.TagHelper.BITS_ALLOCATED) as EvilDicom.VR.UnsignedShort;
  43.             Bits_Allocated = tba.Data;
  44.             var tbs = dcmf.Find(EvilDicom.Helper.TagHelper.BITS_STORED) as EvilDicom.VR.UnsignedShort;
  45.             Bits_Stored = tbs.Data;
  46.             var tpr = dcmf.Find(EvilDicom.Helper.TagHelper.PIXEL_REPRESENTATION) as EvilDicom.VR.UnsignedShort;
  47.             Pixel_Representation = tpr.Data;
  48.  
  49.             var tpd = dcmf.Find(EvilDicom.Helper.TagHelper.PIXEL_DATA) as EvilDicom.VR.PixelData;
  50.             Pixel_Data = tpd.ByteData;
  51.             var tmin = dcmf.Find(EvilDicom.Helper.TagHelper.CHANNEL_MAXIMUM_VALUE) as EvilDicom.VR.IntegerString;
  52.  
  53.         }
  54.         public Bitmap CreateBitmap(string Path)
  55.         {
  56.             ReadDicomFile(Path);
  57.             byte[] AllBits = Pixel_Data;
  58.             ushort[] mas1 = new ushort[Pixel_Data.Length / 2];
  59.             int k = 0;
  60.             int winMin = 65536;
  61.             int winMax = 0;
  62.  
  63.             for (int i = 0; i < AllBits.Length - 1; i += 2)
  64.             {
  65.                 mas1[k] = (ushort)(Convert.ToUInt16((AllBits[i + 1] << 8) + AllBits[i]));
  66.                 if (mas1[k] > winMax) winMax = mas1[k];
  67.                 if (mas1[k] < winMin) winMin = mas1[k];
  68.                 k++;
  69.             }
  70.  
  71.             int range = winMax - winMin;
  72.             if (range < 1) range = 1;
  73.             double factor = 255.0 / range;
  74.  
  75.             Bitmap bmp = new Bitmap(Collums, Rows, PixelFormat.Format24bppRgb);
  76.             BitmapData bmd = bmp.LockBits(new Rectangle(0, 0, Collums, Rows), ImageLockMode.ReadOnly, bmp.PixelFormat);
  77.  
  78.  
  79.             IntPtr xx;
  80.             int bytes = mas1.Length * 3;
  81.             byte[] rgbValues = new byte[bytes];
  82.             int jk = 0;
  83.  
  84.             for (int i = 0; i < bmd.Height; i++)
  85.             {
  86.                 xx = bmd.Scan0 + (i * bmd.Stride);
  87.  
  88.                 for (int j = 0; j < bmd.Width; j++)
  89.                 {
  90.                     rgbValues[jk + 0] = (byte)((mas1[i * bmd.Width + j] - winMin) * factor);
  91.                     rgbValues[jk + 1] = (byte)((mas1[i * bmd.Width + j] - winMin) * factor);
  92.                     rgbValues[jk + 2] = (byte)((mas1[i * bmd.Width + j] - winMin) * factor);
  93.                     jk += 3;
  94.                 }
  95.  
  96.                 System.Runtime.InteropServices.Marshal.Copy(rgbValues, i * bmd.Width * 3, xx, bmd.Width * 3);
  97.             }
  98.  
  99.             bmp.UnlockBits(bmd);
  100.             return bmp;
  101.         }
  102.         private int CheckCollums(string[] Paths)
  103.         {
  104.             int ChCollums = 0;
  105.             bool flag = true;
  106.  
  107.             foreach (string Path in Paths)
  108.             {
  109.                 EvilDicom.Components.DICOMFile dcmf = new EvilDicom.Components.DICOMFile(Path);
  110.                 EvilDicom.Components.DICOMElement dICOMElement = new EvilDicom.Components.DICOMElement();
  111.  
  112.                 var tCollums = dcmf.Find(EvilDicom.Helper.TagHelper.COLUMNS) as EvilDicom.VR.UnsignedShort;
  113.                 var Collums = tCollums.Data;
  114.  
  115.                 if (flag)
  116.                 {
  117.                     ChCollums = (int)Collums;
  118.                     flag = false;
  119.                 }
  120.  
  121.                 if (ChCollums != (int)Collums) ;
  122.                 //Здесь выдавать ошибку
  123.                 //MessageBox.Show("Не совпадают разрешения выбранных Dicom файлов");
  124.             }
  125.             return ChCollums;
  126.         }
  127.         private int CheckRows(string[] Paths)
  128.         {
  129.             int ChRows = 0;
  130.             bool flag = true;
  131.  
  132.             foreach (string Path in Paths)
  133.             {
  134.                 EvilDicom.Components.DICOMFile dcmf = new EvilDicom.Components.DICOMFile(Path);
  135.                 EvilDicom.Components.DICOMElement dICOMElement = new EvilDicom.Components.DICOMElement();
  136.  
  137.                 var trows = dcmf.Find(EvilDicom.Helper.TagHelper.ROWS) as EvilDicom.VR.UnsignedShort;
  138.                 var Rows = trows.Data;
  139.  
  140.                 if (flag)
  141.                 {
  142.                     ChRows = (int)Rows;
  143.                     flag = false;
  144.                 }
  145.  
  146.                 if (ChRows != (int)Rows) ;
  147.                     //Здесь выдавать ошибку
  148.                     //MessageBox.Show("Не совпадают разрешения выбранных Dicom файлов");
  149.             }
  150.             return ChRows;
  151.         }
  152.         public byte[] Buffer(string[] Paths)
  153.         {
  154.             int Collums = CheckCollums(Paths);
  155.             int Rows = CheckRows(Paths);
  156.             byte[] OneTime;
  157.             byte[] OutPut = new byte[2 * Rows * Collums * Paths.Length];
  158.             int k = 0;
  159.  
  160.             foreach (string Path in Paths)
  161.             {
  162.                 OneTime = TreatmentDCM(Path);
  163.                 for (int i = 0; i < OneTime.Length - 1; i++)
  164.                 {
  165.                     OutPut[k] = OneTime[i];
  166.                     k++;
  167.                 }
  168.  
  169.             }
  170.             return OutPut;
  171.         }
  172.         private byte[] TreatmentDCM(string Path)
  173.         {
  174.             EvilDicom.Components.DICOMFile dcmf = new EvilDicom.Components.DICOMFile(Path);
  175.             EvilDicom.Components.DICOMElement dICOMElement = new EvilDicom.Components.DICOMElement();
  176.            
  177.             var tpd = dcmf.Find(EvilDicom.Helper.TagHelper.PIXEL_DATA) as EvilDicom.VR.PixelData;
  178.             var Pixel_Data = tpd.ByteData;
  179.  
  180.             return Pixel_Data;
  181.         }
  182.     }
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement