// Create a 256 x 256 Secondary Capture Image Storage static private void CreateSmallDICOM(string fileName) { using (var writer = new gdcm.PixmapWriter()) { gdcm.Pixmap img = writer.GetImage(); img.SetNumberOfDimensions(3); img.SetDimension(0, 512); img.SetDimension(1, 512); img.SetDimension(2, 2); // fake a 3d volume PhotometricInterpretation pi = new PhotometricInterpretation(PhotometricInterpretation.PIType.MONOCHROME2); img.SetPhotometricInterpretation(pi); gdcm.DataElement pixeldata = new gdcm.DataElement(new gdcm.Tag(0x7fe0, 0x0010)); byte[] buffer = new byte[512 * 512 * 2]; pixeldata.SetByteValue(buffer, new gdcm.VL((uint)buffer.Length)); img.SetDataElement(pixeldata); gdcm.File file = writer.GetFile(); gdcm.DataSet ds = file.GetDataSet(); gdcm.DataElement ms = new gdcm.DataElement(new gdcm.Tag(0x0008, 0x0016)); string mediastorage = "1.2.840.10008.5.1.4.1.1.7.2"; // Multi-frame Grayscale Byte Secondary Capture Image Storage byte[] val = StrToByteArray(mediastorage); ms.SetByteValue(val, new gdcm.VL((uint)val.Length)); ds.Insert(ms); writer.SetFileName(fileName); writer.Write(); } }
float[] GetDirectionCosines(gdcm.DataSet dataset) { string valueAsString = dataset.GetDataElement(Tags.DirectionCosines).GetByteValue().toString(); var partsAsString = valueAsString.Split('\\'); var partsAsFloat = partsAsString.Select(part => float.Parse(part)).ToArray(); return(partsAsFloat); }
float[] GetImagePosition(gdcm.DataSet dataset) { gdcm.DataElement element = dataset.GetDataElement(Tags.ImagePosition); string valueAsString = element.GetByteValue().toString(); var partsAsString = valueAsString.Split('\\'); var partsAsFloat = partsAsString.Select(part => float.Parse(part, System.Globalization.CultureInfo.InvariantCulture)).ToArray(); return(partsAsFloat); }
public static int Main(string[] args) { string filename = args[0]; gdcm.Reader reader = new gdcm.Reader(); reader.SetFileName(filename); if (!reader.Read()) { return(1); } gdcm.File f = reader.GetFile(); gdcm.DataSet ds = f.GetDataSet(); string[] expectedSiemensTags = new string[] { "B_value", "AcquisitionMatrixText" }; using (PrivateTag gtag = CSAHeader.GetCSAImageHeaderInfoTag()) { if (ds.FindDataElement(gtag)) { using (DataElement de = ds.GetDataElement(gtag)) { if (de != null && !de.IsEmpty()) { using (CSAHeader csa = new CSAHeader()) { if (csa.LoadFromDataElement(de)) { foreach (string str in expectedSiemensTags) { if (csa.FindCSAElementByName(str)) { using (CSAElement elem = csa.GetCSAElementByName(str)) { if (elem != null) { System.Console.WriteLine(elem.toString()); } } } } } } } } } } return(0); }
private void FramesQuery(string PatientId) { gdcm.ERootType typ = gdcm.ERootType.ePatientRootType; gdcm.EQueryLevel poziom = gdcm.EQueryLevel.ePatient; // zobacz inne gdcm.KeyValuePairArrayType klucze = new gdcm.KeyValuePairArrayType(); gdcm.KeyValuePairType klucz1 = new gdcm.KeyValuePairType(new gdcm.Tag(0x0010, 0x0020), PatientId); // NIE WOLNO TU STOSOWAC *; tutaj PatientID="01" klucze.Add(klucz1); // skonstruuj zapytanie gdcm.BaseRootQuery zapytanie = gdcm.CompositeNetworkFunctions.ConstructQuery(typ, poziom, klucze, true); // sprawdź, czy zapytanie spełnia kryteria if (!zapytanie.ValidateQuery()) { MessageBox.Show("Wrong frames query.", "Error"); } // przygotuj katalog na wyniki String odebrane = System.IO.Path.Combine(".", "temporary"); if (!System.IO.Directory.Exists(odebrane)) { System.IO.Directory.CreateDirectory(odebrane); } dane = System.IO.Path.Combine(odebrane, System.IO.Path.GetRandomFileName()); //katalog System.IO.Directory.CreateDirectory(dane); // wykonaj zapytanie - pobierz do katalogu _dane_ bool stan = gdcm.CompositeNetworkFunctions.CMove(ip, port, zapytanie, port, aet, call, dane); // sprawdź stan if (!stan) { MessageBox.Show("PACS server doesn't work.", "Error"); } // skasowanie listy zdjęć Images.Clear(); ImageNames.Clear(); Datas.Clear(); List <string> pliki = new List <string>(System.IO.Directory.EnumerateFiles(dane)); //nazwy plikow foreach (String plik in pliki) { gdcm.Reader dataReader = new gdcm.Reader(); dataReader.SetFileName(plik); if (!dataReader.Read()) { continue; } gdcm.File file = dataReader.GetFile(); gdcm.DataSet dataSet = file.GetDataSet(); string data = dataSet.toString(); gdcm.Global g = gdcm.Global.GetInstance(); gdcm.Dicts dicts = g.GetDicts(); gdcm.Dict dict = dicts.GetPublicDict(); string[] dataArray = dataSet.toString().Split('\n'); Dictionary <string, string> dataValues = new Dictionary <string, string>(); String[] id = plik.Split('\\'); foreach (string s in dataArray) { string[] dataArrayRow = s.Split('\t'); if (dataArrayRow.Length > 1) { string[] tags = dataArrayRow[0].Remove(0, 1).Remove(dataArrayRow[0].Length - 2, 1).Split(','); //Pobranie nazwy Tagu //gdcm.Tag tag = new gdcm.Tag(Convert.ToUInt16(tags[0]),Convert.ToUInt16(tags[1])); //string dictDorTag = dict.GetKeywordFromTag(tag); //if (dictDorTag != null) // dataValues.Add(dictDorTag, dataArrayRow[dataArrayRow.Length - 1]); dataValues.Add(dataArrayRow[0], dataArrayRow[dataArrayRow.Length - 1]); } } // przeczytaj pixele gdcm.PixmapReader reader = new gdcm.PixmapReader(); reader.SetFileName(plik); if (!reader.Read()) { continue; } // przekonwertuj na "znany format" gdcm.Bitmap bmjpeg2000 = PACS.ImageConverter.pxmap2jpeg2000(reader.GetPixmap()); // przekonwertuj na .NET bitmapy System.Drawing.Bitmap[] X = PACS.ImageConverter.gdcmBitmap2Bitmap(bmjpeg2000); // zapisz for (int i = 0; i < X.Length; i++) { String name = ""; if (X.Length > 1) { name = String.Format("{0}_slice{1}.jpg", plik, i); Images.Add(String.Format("{0}_slice{1}", id[id.Length - 1], i), X[i]); ImageNames.Add(String.Format("{0}_slice{1}", id[id.Length - 1], i)); Datas.Add(String.Format("{0}_slice{1}", id[id.Length - 1], i), dataValues); } else { name = String.Format("{0}.jpg", plik); Images.Add(String.Format("{0}", id[id.Length - 1]), X[i]); ImageNames.Add(String.Format("{0}", id[id.Length - 1])); Datas.Add(String.Format("{0}", id[id.Length - 1]), dataValues); } X[i].Save(name); } } }
List <PathAndData> SortFilenames(gdcm.FilenamesType files, Func <float, string, float> progressCallback) { var currentFileCount = 0; List <PathAndData> paths = files.Select(currFilePath => { gdcm.DataSet ds1 = GetDatasetFromFile(currFilePath); float percentage = (float)currentFileCount / (float)files.Count(); progressCallback(percentage, currFilePath); Thread.Yield(); string p1Name = GetPatientName(ds1); string p1Study = GetStudyUid(ds1); string p1Series = GetSeriesUid(ds1); float[] p1Position = GetImagePosition(ds1); float[] image1OrientationPlane = GetDirectionCosines(ds1); var pd = new PathAndData() { path = currFilePath, patient = p1Name, study = p1Study, series = p1Series, orientationPlane = image1OrientationPlane, position = p1Position }; currentFileCount++; return(pd); }).ToList <PathAndData>(); paths.Sort((PathAndData file1, PathAndData file2) => { int nameComparison = file1.patient.CompareTo(file2.patient); int studyComparison = file1.study.CompareTo(file2.study); int seriesComparison = file1.series.CompareTo(file2.series); var image1OrientationPlane = file1.orientationPlane; var p1Position = file1.position; var p2Position = file2.position; double[] normal = new double[3]; normal[0] = image1OrientationPlane[1] * image1OrientationPlane[5] - image1OrientationPlane[2] * image1OrientationPlane[4]; normal[1] = image1OrientationPlane[2] * image1OrientationPlane[3] - image1OrientationPlane[0] * image1OrientationPlane[5]; normal[2] = image1OrientationPlane[0] * image1OrientationPlane[4] - image1OrientationPlane[1] * image1OrientationPlane[3]; double dist1 = 0; for (var i = 0; i < 3; ++i) { dist1 += normal[i] * p1Position[i]; } double dist2 = 0; for (var i = 0; i < 3; ++i) { dist2 += normal[i] * p2Position[i]; } int imagePositionComparison = dist1.CompareTo(dist2); if (nameComparison != 0) { return(nameComparison); //Se o nome é diferente retorna a comparacao do nome } if (studyComparison != 0) { return(studyComparison); //Se o nome é igual e o estudo é diferente retorna a comparação do estudo } if (seriesComparison != 0) { return(seriesComparison); //Se o nome e o estudo são iguais e a serie é diferente retorna a comparacao da serie. } //Se o nome, estudo e série são iguais retorna a comparação da image position return(imagePositionComparison); }); return(paths); }
string GetSeriesUid(gdcm.DataSet dataset) { gdcm.DataElement element = dataset.GetDataElement(Tags.SeriesInstanceUID); return(element.GetValue().toString()); }
string GetPatientName(gdcm.DataSet dataset) { //Os mecanismos de gdcm::Attribute tb estão quebrados. gdcm.DataElement element = dataset.GetDataElement(Tags.PatientName); return(element.GetValue().toString()); }
private void FramesQuery(string PatientId, out string dane, out string name, out Dictionary <string, Dictionary <string, string> > Datas, out string segmentation_name) { gdcm.ERootType typ = gdcm.ERootType.ePatientRootType; gdcm.EQueryLevel poziom = gdcm.EQueryLevel.ePatient; // zobacz inne gdcm.KeyValuePairArrayType klucze = new gdcm.KeyValuePairArrayType(); gdcm.KeyValuePairType klucz1 = new gdcm.KeyValuePairType(new gdcm.Tag(0x0010, 0x0020), PatientId); // NIE WOLNO TU STOSOWAC *; tutaj PatientID="01" klucze.Add(klucz1); // skonstruuj zapytanie gdcm.BaseRootQuery zapytanie = gdcm.CompositeNetworkFunctions.ConstructQuery(typ, poziom, klucze, true); // sprawdź, czy zapytanie spełnia kryteria if (!zapytanie.ValidateQuery()) { MessageBox.Show("Wrong frames query.", "Error"); } // przygotuj katalog na wyniki String odebrane = System.IO.Path.Combine(".", "temporary"); if (!System.IO.Directory.Exists(odebrane)) { System.IO.Directory.CreateDirectory(odebrane); } dane = System.IO.Path.Combine(odebrane, System.IO.Path.GetRandomFileName()); //katalog System.IO.Directory.CreateDirectory(dane); // wykonaj zapytanie - pobierz do katalogu _dane_ bool stan = gdcm.CompositeNetworkFunctions.CMove(ip, port, zapytanie, 10104, aet, call, dane); // sprawdź stan if (!stan) { MessageBox.Show("PACS server doesn't work.", "Error"); } // skasowanie listy zdjęć name = ""; segmentation_name = ""; Datas = new Dictionary <string, Dictionary <string, string> >(); List <string> pliki = new List <string>(System.IO.Directory.EnumerateFiles(dane)); //nazwy plikow //OBRAZ ORYGINALNY gdcm.Reader dataReader = new gdcm.Reader(); dataReader.SetFileName(pliki[0]); if (!dataReader.Read()) { } gdcm.File file = dataReader.GetFile(); gdcm.DataSet dataSet = file.GetDataSet(); string data = dataSet.toString(); gdcm.Global g = gdcm.Global.GetInstance(); gdcm.Dicts dicts = g.GetDicts(); gdcm.Dict dict = dicts.GetPublicDict(); string[] dataArray = dataSet.toString().Split('\n'); Dictionary <string, string> dataValues = new Dictionary <string, string>(); String[] id = pliki[0].Split('\\'); bool first_exp = true; bool first_original = true; foreach (string plik in pliki) { dataValues.Clear(); foreach (string s in dataArray) { string[] dataArrayRow = s.Split('\t'); if (dataArrayRow.Length > 1) { string[] tags = dataArrayRow[0].Remove(0, 1).Remove(dataArrayRow[0].Length - 2, 1).Split(','); //Pobranie nazwy Tagu //gdcm.Tag tag = new gdcm.Tag(Convert.ToUInt16(tags[0]),Convert.ToUInt16(tags[1])); //string dictDorTag = dict.GetKeywordFromTag(tag); //if (dictDorTag != null) // dataValues.Add(dictDorTag, dataArrayRow[dataArrayRow.Length - 1]); dataValues.Add(dataArrayRow[0], dataArrayRow[dataArrayRow.Length - 1]); } } if (dataValues.Count > 0) { if (dataValues["(0020,000d)"].Substring(0, 1) == "E" && first_exp == true) {//OBRAZ SEGMENTACJI gdcm.Reader dataReader2 = new gdcm.Reader(); dataReader2.SetFileName(plik); if (!dataReader2.Read()) { } gdcm.File file2 = dataReader2.GetFile(); // przeczytaj pixele gdcm.PixmapReader reader2 = new gdcm.PixmapReader(); string temp = plik; if (plik.Substring(plik.Length - 4, 4) != ".dcm") { temp = pliki[1] + ".dcm"; } reader2.SetFileName(plik); if (!reader2.Read()) { } segmentation_name = String.Format("{0}", plik.Substring(0, plik.Length - 4)); first_exp = false; } else { if (first_original == true) { // przeczytaj pixele gdcm.PixmapReader reader = new gdcm.PixmapReader(); string temp = plik; if (plik.Substring(plik.Length - 4, 4) != ".dcm") { temp = plik + ".dcm"; } reader.SetFileName(plik); if (!reader.Read()) { } name = String.Format("{0}", plik.Substring(0, plik.Length - 4)); Datas.Add(String.Format("{0}", plik.Substring(0, plik.Length - 4)).Replace("\\", "\\\\"), dataValues); first_original = false; } else { gdcm.Reader dataReader2 = new gdcm.Reader(); dataReader2.SetFileName(plik); if (!dataReader2.Read()) { } gdcm.File file2 = dataReader2.GetFile(); // przeczytaj pixele gdcm.PixmapReader reader2 = new gdcm.PixmapReader(); string temp = plik; if (plik.Substring(plik.Length - 4, 4) != ".dcm") { temp = pliki[1] + ".dcm"; } reader2.SetFileName(plik); if (!reader2.Read()) { } segmentation_name = String.Format("{0}", plik.Substring(0, plik.Length - 4)); first_exp = false; } } } } }