You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
939 lines
34 KiB
939 lines
34 KiB
// using System;
|
|
// using System.Collections.Generic;
|
|
// using System.Globalization;
|
|
// using System.IO;
|
|
// using System.Linq;
|
|
//
|
|
// namespace DICOMCoverter
|
|
// {
|
|
// public enum TypeOfDicomFile
|
|
// {
|
|
// NotDicom,
|
|
// Dicom3File,
|
|
// DicomOldTypeFile,
|
|
// DicomUnknownTransferSyntax
|
|
// };
|
|
//
|
|
// public class DicomDecoder
|
|
// {
|
|
// #region 定义变量与初始化
|
|
//
|
|
// private const uint PIXEL_REPRESENTATION = 0x00280103;
|
|
// private const uint TRANSFER_SYNTAX_UID = 0x00020010;
|
|
// private const uint MODALITY = 0x00080060;
|
|
// private const uint SLICE_THICKNESS = 0x00180050;
|
|
// private const uint SLICE_SPACING = 0x00180088;
|
|
// private const uint SAMPLES_PER_PIXEL = 0x00280002;
|
|
// private const uint PHOTOMETRIC_INTERPRETATION = 0x00280004;
|
|
// private const uint PLANAR_CONFIGURATION = 0x00280006;
|
|
// private const uint NUMBER_OF_FRAMES = 0x00280008;
|
|
// private const uint ROWS = 0x00280010;
|
|
// private const uint COLUMNS = 0x00280011;
|
|
// private const uint PIXEL_SPACING = 0x00280030;
|
|
// private const uint BITS_ALLOCATED = 0x00280100;
|
|
// private const uint WINDOW_CENTER = 0x00281050;
|
|
// private const uint WINDOW_WIDTH = 0x00281051;
|
|
// private const uint RESCALE_INTERCEPT = 0x00281052;
|
|
// private const uint RESCALE_SLOPE = 0x00281053;
|
|
// private const uint RED_PALETTE = 0x00281201;
|
|
// private const uint GREEN_PALETTE = 0x00281202;
|
|
// private const uint BLUE_PALETTE = 0x00281203;
|
|
// private const uint ICON_IMAGE_SEQUENCE = 0x00880200;
|
|
// private const uint PIXEL_DATA = 0x7FE00010;
|
|
//
|
|
// private const string ITEM = "FFFEE000";
|
|
// private const string ITEM_DELIMITATION = "FFFEE00D";
|
|
// private const string SEQUENCE_DELIMITATION = "FFFEE0DD";
|
|
//
|
|
// private const int
|
|
// AE = 0x4145,
|
|
// AS = 0x4153,
|
|
// AT = 0x4154,
|
|
// CS = 0x4353,
|
|
// DA = 0x4441,
|
|
// DS = 0x4453,
|
|
// DT = 0x4454,
|
|
// FD = 0x4644,
|
|
// FL = 0x464C,
|
|
// IS = 0x4953,
|
|
// LO = 0x4C4F,
|
|
// LT = 0x4C54,
|
|
// PN = 0x504E,
|
|
// SH = 0x5348,
|
|
// SL = 0x534C,
|
|
// SS = 0x5353,
|
|
// ST = 0x5354,
|
|
// TM = 0x544D,
|
|
// UI = 0x5549,
|
|
// UL = 0x554C,
|
|
// US = 0x5553,
|
|
// UT = 0x5554,
|
|
// OB = 0x4F42,
|
|
// OW = 0x4F57,
|
|
// SQ = 0x5351,
|
|
// UN = 0x554E,
|
|
// QQ = 0x3F3F,
|
|
// RT = 0x5254;
|
|
//
|
|
// private const int ID_OFFSET = 128; //location of "DICM"
|
|
// private const int IMPLICIT_VR = 0x2D2D; // '--'
|
|
// private const String DICM = "DICM";
|
|
//
|
|
// public int bitsAllocated;
|
|
// public int width;
|
|
// public int height;
|
|
// public int offset;
|
|
// public int nImages;
|
|
// public int samplesPerPixel;
|
|
// public double pixelDepth = 1.0;
|
|
// public double pixelWidth = 1.0;
|
|
// public double pixelHeight = 1.0;
|
|
// public string unit;
|
|
// public double windowCentre, windowWidth;
|
|
// public bool signedImage;
|
|
// public TypeOfDicomFile typeofDicomFile;
|
|
// public List<string> dicomInfo;
|
|
// public bool dicmFound; // "DICM" found at offset 128
|
|
//
|
|
// private DicomDictionary dic;
|
|
// private BinaryReader file;
|
|
// private String dicomFileName;
|
|
//
|
|
// /// <summary>
|
|
// /// Photometric Interpretation有以下几种类型:
|
|
// ///Monochrome2 一般的灰度图像都采用这种,Pixel值越大,图像就越白。
|
|
// ///Monochrome1 只有部分CR, DR图像使用,Pixel值越大,图像就越黑。
|
|
// /// </summary>
|
|
// private String photoInterpretation;
|
|
//
|
|
// private bool littleEndian = true;
|
|
// private bool oddLocations; // one or more tags at odd locations
|
|
// private bool bigEndianTransferSyntax = false;
|
|
// private bool inSequence;
|
|
// private bool widthTagFound;
|
|
// private bool heightTagFound;
|
|
// private bool pixelDataTagFound;
|
|
// private int location = 0;
|
|
// private int elementLength;
|
|
// private int vr; // Value Representation
|
|
// private int min8 = Byte.MinValue;
|
|
// private int max8 = Byte.MaxValue;
|
|
// private int min16 = short.MinValue;
|
|
// private int max16 = ushort.MaxValue;
|
|
// private int pixelRepresentation;
|
|
// private double rescaleIntercept;
|
|
// private double rescaleSlope;
|
|
// private byte[] reds;
|
|
// private byte[] greens;
|
|
// private byte[] blues;
|
|
// private byte[] vrLetters = new byte[2];
|
|
// private List<byte> pixels8;
|
|
// private List<byte> pixels24; // 8 bits bit depth, 3 samples per pixel
|
|
// private List<ushort> pixels16;
|
|
// private List<int> pixels16Int;
|
|
//
|
|
// public DicomDecoder()
|
|
// {
|
|
// dic = new DicomDictionary();
|
|
// signedImage = false;
|
|
// dicomInfo = new List<string>();
|
|
// InitializeDicom();
|
|
// }
|
|
//
|
|
// private void InitializeDicom()
|
|
// {
|
|
// bitsAllocated = 0;
|
|
// width = 1;
|
|
// height = 1;
|
|
// offset = 1;
|
|
// nImages = 1;
|
|
// samplesPerPixel = 1;
|
|
// photoInterpretation = "";
|
|
// unit = "mm";
|
|
// windowCentre = 0;
|
|
// windowWidth = 0;
|
|
// signedImage = false;
|
|
// widthTagFound = false;
|
|
// heightTagFound = false;
|
|
// pixelDataTagFound = false;
|
|
// rescaleIntercept = 0.0; // Default value
|
|
// rescaleSlope = 1.0; // Default value
|
|
// typeofDicomFile = TypeOfDicomFile.NotDicom;
|
|
// }
|
|
//
|
|
// #endregion 定义变量与初始化
|
|
//
|
|
// //public string DicomFileName
|
|
// //{
|
|
// // set
|
|
// // {
|
|
// // dicomFileName = value;
|
|
// // InitializeDicom();
|
|
//
|
|
// // // Thanks to CodeProject member Alphons van der Heijden for
|
|
// // // suggesting to add this - FileAccess.Read (July 2010)
|
|
// // file = new BinaryReader(File.Open(dicomFileName, FileMode.Open, FileAccess.Read));
|
|
// // location = 0; // Reset the location
|
|
// // dicomInfo.Clear();
|
|
// // try
|
|
// // {
|
|
// // bool readResult = ReadFileInfo();
|
|
// // if (readResult && widthTagFound && heightTagFound && pixelDataTagFound)
|
|
// // {
|
|
// // ReadPixels();
|
|
// // if (dicmFound == true)
|
|
// // typeofDicomFile = TypeOfDicomFile.Dicom3File;
|
|
// // else
|
|
// // typeofDicomFile = TypeOfDicomFile.DicomOldTypeFile;
|
|
// // }
|
|
// // }
|
|
// // catch
|
|
// // {
|
|
// // // Nothing here
|
|
// // }
|
|
// // finally
|
|
// // {
|
|
// // file.Close();
|
|
// // }
|
|
// // }
|
|
// //}
|
|
//
|
|
// /// <summary>
|
|
// ///读取dicom文件及操作
|
|
// ///<famenum>取图片第几帧</famenum>
|
|
// /// </summary>
|
|
// public void ReadDicomFile(string path, int famenum = 1)
|
|
// {
|
|
// file = new BinaryReader(File.Open(path, FileMode.Open, FileAccess.Read));
|
|
// location = 0; // Reset the location
|
|
// dicomInfo.Clear();
|
|
// try
|
|
// {
|
|
// //读Tag信息
|
|
// bool readResult = ReadFileInfo();
|
|
// //图片宽高及图像数据都已读到
|
|
// if (readResult && widthTagFound && heightTagFound && pixelDataTagFound)
|
|
// {
|
|
// ////存在多帧图像
|
|
// //if (nImages > 1)
|
|
// //{
|
|
// // for (int i = 1; i < nImages; i++)
|
|
// // {
|
|
// // ReadPixels(i);
|
|
// // }
|
|
// //}
|
|
// //else {
|
|
// // //读取图片数据
|
|
// // ReadPixels();
|
|
// //}
|
|
//
|
|
// ReadPixels();
|
|
//
|
|
// if (dicmFound == true)
|
|
// typeofDicomFile = TypeOfDicomFile.Dicom3File;
|
|
// else
|
|
// typeofDicomFile = TypeOfDicomFile.DicomOldTypeFile;
|
|
// }
|
|
// }
|
|
// catch (Exception ex)
|
|
// {
|
|
// // Nothing here
|
|
// }
|
|
// finally
|
|
// {
|
|
// file.Close();
|
|
// }
|
|
// }
|
|
//
|
|
// private void BuildImage()
|
|
// {
|
|
// }
|
|
//
|
|
// public void GetPixels8(ref List<byte> pixels)
|
|
// {
|
|
// pixels = pixels8;
|
|
// }
|
|
//
|
|
// public void GetPixels16(ref List<ushort> pixels)
|
|
// {
|
|
// pixels = pixels16;
|
|
// }
|
|
//
|
|
// public void GetPixels24(ref List<byte> pixels)
|
|
// {
|
|
// pixels = pixels24;
|
|
// }
|
|
//
|
|
// private String GetString(int length)
|
|
// {
|
|
// byte[] buf = new byte[length];
|
|
// file.BaseStream.Position = location;
|
|
// int count = file.Read(buf, 0, length);
|
|
// location += length;
|
|
// string s = System.Text.ASCIIEncoding.ASCII.GetString(buf);
|
|
// return s;
|
|
// }
|
|
//
|
|
// private byte GetByte() // Changed return type to byte
|
|
// {
|
|
// file.BaseStream.Position = location;
|
|
// byte b = file.ReadByte();
|
|
// ++location;
|
|
// return b;
|
|
// }
|
|
//
|
|
// private ushort GetShort() // Changed return type to ushort
|
|
// {
|
|
// byte b0 = GetByte();
|
|
// byte b1 = GetByte();
|
|
// ushort s;
|
|
// if (littleEndian)
|
|
// s = Convert.ToUInt16((b1 << 8) + b0);
|
|
// else
|
|
// s = Convert.ToUInt16((b0 << 8) + b1);
|
|
// return s;
|
|
// }
|
|
//
|
|
// private int GetInt()
|
|
// {
|
|
// byte b0 = GetByte();
|
|
// byte b1 = GetByte();
|
|
// byte b2 = GetByte();
|
|
// byte b3 = GetByte();
|
|
// int i;
|
|
// if (littleEndian)
|
|
// i = (b3 << 24) + (b2 << 16) + (b1 << 8) + b0;
|
|
// else
|
|
// i = (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
|
|
// return i;
|
|
// }
|
|
//
|
|
// private double GetDouble()
|
|
// {
|
|
// byte b0 = GetByte();
|
|
// byte b1 = GetByte();
|
|
// byte b2 = GetByte();
|
|
// byte b3 = GetByte();
|
|
// byte b4 = GetByte();
|
|
// byte b5 = GetByte();
|
|
// byte b6 = GetByte();
|
|
// byte b7 = GetByte();
|
|
//
|
|
// long res = 0;
|
|
// if (littleEndian)
|
|
// {
|
|
// res += b0;
|
|
// res += (((long)b1) << 8);
|
|
// res += (((long)b2) << 16);
|
|
// res += (((long)b3) << 24);
|
|
// res += (((long)b4) << 32);
|
|
// res += (((long)b5) << 40);
|
|
// res += (((long)b6) << 48);
|
|
// res += (((long)b7) << 56);
|
|
// }
|
|
// else
|
|
// {
|
|
// res += b7;
|
|
// res += (((long)b6) << 8);
|
|
// res += (((long)b5) << 16);
|
|
// res += (((long)b4) << 24);
|
|
// res += (((long)b3) << 32);
|
|
// res += (((long)b2) << 40);
|
|
// res += (((long)b1) << 48);
|
|
// res += (((long)b0) << 56);
|
|
// }
|
|
//
|
|
// double d = Convert.ToDouble(res, new CultureInfo("en-US"));
|
|
// return d;
|
|
// }
|
|
//
|
|
// private float GetFloat()
|
|
// {
|
|
// byte b0 = GetByte();
|
|
// byte b1 = GetByte();
|
|
// byte b2 = GetByte();
|
|
// byte b3 = GetByte();
|
|
//
|
|
// int res = 0;
|
|
//
|
|
// if (littleEndian)
|
|
// {
|
|
// res += b0;
|
|
// res += (((int)b1) << 8);
|
|
// res += (((int)b2) << 16);
|
|
// res += (((int)b3) << 24);
|
|
// }
|
|
// else
|
|
// {
|
|
// res += b3;
|
|
// res += (((int)b2) << 8);
|
|
// res += (((int)b1) << 16);
|
|
// res += (((int)b0) << 24);
|
|
// }
|
|
//
|
|
// float f1;
|
|
// f1 = Convert.ToSingle(res, new CultureInfo("en-US"));
|
|
// return f1;
|
|
// }
|
|
//
|
|
// private byte[] GetLut(int length)
|
|
// {
|
|
// if ((length & 1) != 0) // odd
|
|
// {
|
|
// String dummy = GetString(length);
|
|
// return null;
|
|
// }
|
|
//
|
|
// length /= 2;
|
|
// byte[] lut = new byte[length];
|
|
// for (int i = 0; i < length; ++i)
|
|
// lut[i] = Convert.ToByte(GetShort() >> 8);
|
|
// return lut;
|
|
// }
|
|
//
|
|
// private int GetLength()
|
|
// {
|
|
// byte b0 = GetByte();
|
|
// byte b1 = GetByte();
|
|
// byte b2 = GetByte();
|
|
// byte b3 = GetByte();
|
|
//
|
|
// // Cannot know whether the VR is implicit or explicit without the
|
|
// // complete Dicom Data Dictionary.
|
|
// vr = (b0 << 8) + b1;
|
|
//
|
|
// switch (vr)
|
|
// {
|
|
// case OB:
|
|
// case OW:
|
|
// case SQ:
|
|
// case UN:
|
|
// case UT:
|
|
// // Explicit VR with 32-bit length if other two bytes are zero
|
|
// if ((b2 == 0) || (b3 == 0)) return GetInt();
|
|
// // Implicit VR with 32-bit length
|
|
// vr = IMPLICIT_VR;
|
|
// if (littleEndian)
|
|
// return ((b3 << 24) + (b2 << 16) + (b1 << 8) + b0);
|
|
// else
|
|
// return ((b0 << 24) + (b1 << 16) + (b2 << 8) + b3);
|
|
// // break; // Not necessary
|
|
// case AE:
|
|
// case AS:
|
|
// case AT:
|
|
// case CS:
|
|
// case DA:
|
|
// case DS:
|
|
// case DT:
|
|
// case FD:
|
|
// case FL:
|
|
// case IS:
|
|
// case LO:
|
|
// case LT:
|
|
// case PN:
|
|
// case SH:
|
|
// case SL:
|
|
// case SS:
|
|
// case ST:
|
|
// case TM:
|
|
// case UI:
|
|
// case UL:
|
|
// case US:
|
|
// case QQ:
|
|
// case RT:
|
|
// // Explicit vr with 16-bit length
|
|
// if (littleEndian)
|
|
// return ((b3 << 8) + b2);
|
|
// else
|
|
// return ((b2 << 8) + b3);
|
|
//
|
|
// default:
|
|
// // Implicit VR with 32-bit length...
|
|
// vr = IMPLICIT_VR;
|
|
// if (littleEndian)
|
|
// return ((b3 << 24) + (b2 << 16) + (b1 << 8) + b0);
|
|
// else
|
|
// return ((b0 << 24) + (b1 << 16) + (b2 << 8) + b3);
|
|
// }
|
|
// }
|
|
//
|
|
// private int GetNextTag()
|
|
// {
|
|
// int groupWord = GetShort();
|
|
// if (groupWord == 0x0800 && bigEndianTransferSyntax)
|
|
// {
|
|
// littleEndian = false;
|
|
// groupWord = 0x0008;
|
|
// }
|
|
// int elementWord = GetShort();
|
|
// int tag = groupWord << 16 | elementWord;
|
|
//
|
|
// elementLength = GetLength();
|
|
//
|
|
// // Hack to read some GE files
|
|
// if (elementLength == 13 && !oddLocations)
|
|
// elementLength = 10;
|
|
//
|
|
// // "Undefined" element length.
|
|
// // This is a sort of bracket that encloses a sequence of elements.
|
|
// if (elementLength == -1)
|
|
// {
|
|
// elementLength = 0;
|
|
// inSequence = true;
|
|
// }
|
|
// return tag;
|
|
// }
|
|
//
|
|
// private String GetHeaderInfo(int tag, String value)
|
|
// {
|
|
// string str = tag.ToString("X8");
|
|
// if (str == ITEM_DELIMITATION || str == SEQUENCE_DELIMITATION)
|
|
// {
|
|
// inSequence = false;
|
|
// return null;
|
|
// }
|
|
//
|
|
// string id = null;
|
|
//
|
|
// if (dic.dict.ContainsKey(str))
|
|
// {
|
|
// id = dic.dict[str];
|
|
// if (id != null)
|
|
// {
|
|
// if (vr == IMPLICIT_VR)
|
|
// vr = (id[0] << 8) + id[1];
|
|
// id = id.Substring(2);
|
|
// }
|
|
// }
|
|
//
|
|
// if (str == ITEM)
|
|
// return (id != null ? id : ":null");
|
|
// if (value != null)
|
|
// return id + ": " + value;
|
|
//
|
|
// switch (vr)
|
|
// {
|
|
// case FD:
|
|
// for (int i = 0; i < elementLength; ++i)
|
|
// GetByte();
|
|
// break;
|
|
//
|
|
// case FL:
|
|
// for (int i = 0; i < elementLength; i++)
|
|
// GetByte();
|
|
// break;
|
|
//
|
|
// case AE:
|
|
// case AS:
|
|
// case AT:
|
|
// case CS:
|
|
// case DA:
|
|
// case DS:
|
|
// case DT:
|
|
// case IS:
|
|
// case LO:
|
|
// case LT:
|
|
// case PN:
|
|
// case SH:
|
|
// case ST:
|
|
// case TM:
|
|
// case UI:
|
|
// value = GetString(elementLength);
|
|
// break;
|
|
//
|
|
// case US:
|
|
// if (elementLength == 2)
|
|
// value = Convert.ToString(GetShort());
|
|
// else
|
|
// {
|
|
// value = "";
|
|
// int n = elementLength / 2;
|
|
// for (int i = 0; i < n; i++)
|
|
// value += Convert.ToString(GetShort()) + " ";
|
|
// }
|
|
// break;
|
|
//
|
|
// case IMPLICIT_VR:
|
|
// value = GetString(elementLength);
|
|
// if (elementLength > 44)
|
|
// value = null;
|
|
// break;
|
|
//
|
|
// case SQ:
|
|
// value = "";
|
|
// bool privateTag = ((tag >> 16) & 1) != 0;
|
|
// if (tag != ICON_IMAGE_SEQUENCE && !privateTag)
|
|
// break;
|
|
// goto default;
|
|
// default:
|
|
// location += elementLength;
|
|
// value = "";
|
|
// break;
|
|
// }
|
|
//
|
|
// if (value != null && id == null && value != "")
|
|
// return "---: " + value;
|
|
// else if (id == null)
|
|
// return null;
|
|
// else
|
|
// return id + ": " + value;
|
|
// }
|
|
//
|
|
// private void AddInfo(int tag, string value)
|
|
// {
|
|
// string info = GetHeaderInfo(tag, value);
|
|
//
|
|
// string str = tag.ToString("X");
|
|
// string strPadded = str.PadLeft(8, '0');
|
|
// string strInfo;
|
|
// if (inSequence && info != null && vr != SQ)
|
|
// info = ">" + info;
|
|
// if (info != null && str != ITEM)
|
|
// {
|
|
// if (info.Contains("---"))
|
|
// strInfo = info.Replace("---", "Private Tag");
|
|
// else
|
|
// strInfo = info;
|
|
//
|
|
// dicomInfo.Add(strPadded + "//" + strInfo);
|
|
// }
|
|
// }
|
|
//
|
|
// private void AddInfo(int tag, int value)
|
|
// {
|
|
// AddInfo(tag, Convert.ToString(value));
|
|
// }
|
|
//
|
|
// private void GetSpatialScale(String scale)
|
|
// {
|
|
// double xscale = 0, yscale = 0;
|
|
// int i = scale.IndexOf('\\');
|
|
// if (i == 1) // Aug 2012, Fixed an issue found while opening some images
|
|
// {
|
|
// yscale = Convert.ToDouble(scale.Substring(0, i), new CultureInfo("en-US"));
|
|
// xscale = Convert.ToDouble(scale.Substring(i + 1), new CultureInfo("en-US"));
|
|
// }
|
|
// if (xscale != 0.0 && yscale != 0.0)
|
|
// {
|
|
// pixelWidth = xscale;
|
|
// pixelHeight = yscale;
|
|
// unit = "mm";
|
|
// }
|
|
// }
|
|
//
|
|
// /// <summary>
|
|
// /// 读取Tag信息
|
|
// /// </summary>
|
|
// /// <returns></returns>
|
|
// public bool ReadFileInfo()
|
|
// {
|
|
// long skipCount = Convert.ToInt32(ID_OFFSET);
|
|
// bitsAllocated = 16;
|
|
//
|
|
// file.BaseStream.Seek(skipCount, SeekOrigin.Begin);
|
|
// location += ID_OFFSET;
|
|
//
|
|
// if (GetString(4) != DICM)
|
|
// {
|
|
// // This is for reading older DICOM files (Before 3.0)
|
|
// // Seek from the beginning of the file
|
|
// file.BaseStream.Seek(0, SeekOrigin.Begin);
|
|
// location = 0;
|
|
//
|
|
// // Older DICOM files do not have the preamble and prefix
|
|
// dicmFound = false;
|
|
//
|
|
// // Continue reading further.
|
|
// // See whether the width, height and pixel data tags
|
|
// // are present. If these tags are present, then it we conclude that this is a
|
|
// // DICOM file, because all DICOM files should have at least these three tags.
|
|
// // Otherwise, it is not a DICOM file.
|
|
// }
|
|
// else
|
|
// {
|
|
// // We have a DICOM 3.0 file
|
|
// dicmFound = true;
|
|
// }
|
|
//
|
|
// bool decodingTags = true;
|
|
// samplesPerPixel = 1;
|
|
// int planarConfiguration = 0;
|
|
// photoInterpretation = "";
|
|
// string modality;
|
|
//
|
|
// while (decodingTags)
|
|
// {
|
|
// int tag = GetNextTag();
|
|
// if ((location & 1) != 0)
|
|
// oddLocations = true;
|
|
//
|
|
// if (inSequence)
|
|
// {
|
|
// AddInfo(tag, null);
|
|
// continue;
|
|
// }
|
|
//
|
|
// string s;
|
|
// switch (tag)
|
|
// {
|
|
// case (int)(TRANSFER_SYNTAX_UID):
|
|
// s = GetString(elementLength);
|
|
// AddInfo(tag, s);
|
|
// //if (s.IndexOf("1.2.4") > -1 || s.IndexOf("1.2.5") > -1)
|
|
// //{
|
|
// // file.Close();
|
|
// // typeofDicomFile = TypeOfDicomFile.DicomUnknownTransferSyntax;
|
|
// // // Return gracefully indicating that this type of
|
|
// // // Transfer Syntax cannot be handled
|
|
// // return false;
|
|
// //}
|
|
// if (s.IndexOf("1.2.840.10008.1.2.2") >= 0)
|
|
// bigEndianTransferSyntax = true;
|
|
// break;
|
|
//
|
|
// case (int)MODALITY:
|
|
// modality = GetString(elementLength);
|
|
// AddInfo(tag, modality);
|
|
// break;
|
|
//
|
|
// case (int)(NUMBER_OF_FRAMES):
|
|
// s = GetString(elementLength);
|
|
// AddInfo(tag, s);
|
|
// double frames = Convert.ToDouble(s, new CultureInfo("en-US"));
|
|
// if (frames > 1.0)
|
|
// nImages = (int)frames;
|
|
// break;
|
|
//
|
|
// case (int)(SAMPLES_PER_PIXEL):
|
|
// samplesPerPixel = GetShort();
|
|
// AddInfo(tag, samplesPerPixel);
|
|
// break;
|
|
//
|
|
// case (int)(PHOTOMETRIC_INTERPRETATION):
|
|
// photoInterpretation = GetString(elementLength);
|
|
// photoInterpretation = photoInterpretation.Trim();
|
|
// AddInfo(tag, photoInterpretation);
|
|
// break;
|
|
//
|
|
// case (int)(PLANAR_CONFIGURATION):
|
|
// planarConfiguration = GetShort();
|
|
// AddInfo(tag, planarConfiguration);
|
|
// break;
|
|
//
|
|
// case (int)(ROWS):
|
|
// height = GetShort();
|
|
// AddInfo(tag, height);
|
|
// heightTagFound = true;
|
|
// break;
|
|
//
|
|
// case (int)(COLUMNS):
|
|
// width = GetShort();
|
|
// AddInfo(tag, width);
|
|
// widthTagFound = true;
|
|
// break;
|
|
//
|
|
// case (int)(PIXEL_SPACING):
|
|
// String scale = GetString(elementLength);
|
|
// GetSpatialScale(scale);
|
|
// AddInfo(tag, scale);
|
|
// break;
|
|
//
|
|
// case (int)(SLICE_THICKNESS):
|
|
// case (int)(SLICE_SPACING):
|
|
// String spacing = GetString(elementLength);
|
|
// pixelDepth = Convert.ToDouble(spacing, new CultureInfo("en-US"));
|
|
// AddInfo(tag, spacing);
|
|
// break;
|
|
//
|
|
// case (int)(BITS_ALLOCATED):
|
|
// bitsAllocated = GetShort();
|
|
// AddInfo(tag, bitsAllocated);
|
|
// break;
|
|
//
|
|
// case (int)(PIXEL_REPRESENTATION):
|
|
// pixelRepresentation = GetShort();
|
|
// AddInfo(tag, pixelRepresentation);
|
|
// break;
|
|
//
|
|
// case (int)(WINDOW_CENTER):
|
|
// String center = GetString(elementLength);
|
|
// int index = center.IndexOf('\\');
|
|
// if (index != -1) center = center.Substring(index + 1);
|
|
// windowCentre = Convert.ToDouble(center, new CultureInfo("en-US"));
|
|
// AddInfo(tag, center);
|
|
// break;
|
|
//
|
|
// case (int)(WINDOW_WIDTH):
|
|
// String widthS = GetString(elementLength);
|
|
// index = widthS.IndexOf('\\');
|
|
// if (index != -1) widthS = widthS.Substring(index + 1);
|
|
// windowWidth = Convert.ToDouble(widthS, new CultureInfo("en-US"));
|
|
// AddInfo(tag, widthS);
|
|
// break;
|
|
//
|
|
// case (int)(RESCALE_INTERCEPT):
|
|
// String intercept = GetString(elementLength);
|
|
// rescaleIntercept = Convert.ToDouble(intercept, new CultureInfo("en-US"));
|
|
// AddInfo(tag, intercept);
|
|
// break;
|
|
//
|
|
// case (int)(RESCALE_SLOPE):
|
|
// String slop = GetString(elementLength);
|
|
// rescaleSlope = Convert.ToDouble(slop, new CultureInfo("en-US"));
|
|
// AddInfo(tag, slop);
|
|
// break;
|
|
//
|
|
// case (int)(RED_PALETTE):
|
|
// reds = GetLut(elementLength);
|
|
// AddInfo(tag, elementLength / 2);
|
|
// break;
|
|
//
|
|
// case (int)(GREEN_PALETTE):
|
|
// greens = GetLut(elementLength);
|
|
// AddInfo(tag, elementLength / 2);
|
|
// break;
|
|
//
|
|
// case (int)(BLUE_PALETTE):
|
|
// blues = GetLut(elementLength);
|
|
// AddInfo(tag, elementLength / 2);
|
|
// break;
|
|
//
|
|
// case (int)(PIXEL_DATA):
|
|
// // Start of image data...
|
|
// if (elementLength != 0)
|
|
// {
|
|
// offset = location;
|
|
// AddInfo(tag, location);
|
|
// decodingTags = false;
|
|
// }
|
|
// else
|
|
// AddInfo(tag, null);
|
|
// pixelDataTagFound = true;
|
|
// break;
|
|
// //case Convert.ToInt64(ITEM, 16):
|
|
//
|
|
// // break;
|
|
// default:
|
|
// AddInfo(tag, null);
|
|
// break;
|
|
// }
|
|
// }
|
|
// return true;
|
|
// }
|
|
//
|
|
// /// <summary>
|
|
// /// 读取图片信息(从1 开始)
|
|
// /// <famenum>取图片第几帧</famenum>
|
|
// /// </summary>
|
|
// private void ReadPixels(int famenum = 1)
|
|
// {
|
|
// //if (famenum > 1)
|
|
// //{
|
|
// // //默认offset就是第一帧的位置
|
|
// // offset = width * height * (famenum - 1);
|
|
// //}
|
|
//
|
|
// if (samplesPerPixel == 1 && bitsAllocated == 8)
|
|
// {
|
|
// if (pixels8 != null)
|
|
// pixels8.Clear();
|
|
// pixels8 = new List<byte>();
|
|
// int numPixels = width * height;
|
|
// byte[] buf = new byte[numPixels];
|
|
//
|
|
// file.BaseStream.Position = offset;
|
|
// file.Read(buf, 0, numPixels);
|
|
//
|
|
// for (int i = 0; i < numPixels; ++i)
|
|
// {
|
|
// int pixVal = (int)(buf[i] * rescaleSlope + rescaleIntercept);
|
|
//
|
|
// if (photoInterpretation == "MONOCHROME1")
|
|
// pixVal = max8 - pixVal;
|
|
//
|
|
// pixels8.Add((byte)(pixelRepresentation == 1 ? pixVal : (pixVal - min8)));
|
|
// }
|
|
// }
|
|
//
|
|
// if (samplesPerPixel == 1 && bitsAllocated == 16)
|
|
// {
|
|
// if (pixels16 != null)
|
|
// pixels16.Clear();
|
|
// if (pixels16Int != null)
|
|
// pixels16Int.Clear();
|
|
//
|
|
// pixels16 = new List<ushort>();
|
|
// pixels16Int = new List<int>();
|
|
// int numPixels = width * height;
|
|
// byte[] bufByte = new byte[numPixels * 2];
|
|
// byte[] signedData = new byte[2];
|
|
// file.BaseStream.Position = offset;
|
|
// file.Read(bufByte, 0, numPixels * 2);
|
|
// ushort unsignedS;
|
|
// int i, i1, pixVal;
|
|
// byte b0, b1;
|
|
//
|
|
// for (i = 0; i < numPixels; ++i)
|
|
// {
|
|
// i1 = i * 2;
|
|
// b0 = bufByte[i1];
|
|
// b1 = bufByte[i1 + 1];
|
|
// unsignedS = Convert.ToUInt16((b1 << 8) + b0);
|
|
// if (pixelRepresentation == 0) // Unsigned
|
|
// {
|
|
// pixVal = (int)(unsignedS * rescaleSlope + rescaleIntercept);
|
|
// if (photoInterpretation == "MONOCHROME1")
|
|
// pixVal = max16 - pixVal;
|
|
// }
|
|
// else // Pixel representation is 1, indicating a 2s complement image
|
|
// {
|
|
// signedData[0] = b0;
|
|
// signedData[1] = b1;
|
|
// short sVal = System.BitConverter.ToInt16(signedData, 0);
|
|
//
|
|
// // Need to consider rescale slope and intercepts to compute the final pixel value
|
|
// pixVal = (int)(sVal * rescaleSlope + rescaleIntercept);
|
|
// if (photoInterpretation == "MONOCHROME1")
|
|
// pixVal = max16 - pixVal;
|
|
// }
|
|
// pixels16Int.Add(pixVal);
|
|
// }
|
|
//
|
|
// int minPixVal = pixels16Int.Min();
|
|
// signedImage = false;
|
|
// if (minPixVal < 0) signedImage = true;
|
|
//
|
|
// // Use the above pixel data to populate the list pixels16
|
|
// foreach (int pixel in pixels16Int)
|
|
// {
|
|
// // We internally convert all 16-bit images to the range 0 - 65535
|
|
// if (signedImage)
|
|
// pixels16.Add((ushort)(pixel - min16));
|
|
// else
|
|
// pixels16.Add((ushort)(pixel));
|
|
// }
|
|
//
|
|
// pixels16Int.Clear();
|
|
// }
|
|
//
|
|
// // 30 July 2010 - to account for Ultrasound images
|
|
// if (samplesPerPixel == 3 && bitsAllocated == 8)
|
|
// {
|
|
// signedImage = false;
|
|
// if (pixels24 != null)
|
|
// pixels24.Clear();
|
|
// pixels24 = new List<byte>();
|
|
// int numPixels = width * height;
|
|
// int numBytes = numPixels * samplesPerPixel;
|
|
// byte[] buf = new byte[numBytes];
|
|
// file.BaseStream.Position = offset;
|
|
// file.Read(buf, 0, numBytes);
|
|
//
|
|
// for (int i = 0; i < numBytes; ++i)
|
|
// {
|
|
// pixels24.Add(buf[i]);
|
|
// }
|
|
// }
|
|
// }
|
|
// }
|
|
// } |