public static void SaveTo(string path, DiVolume volume) { for (int slice = 0; slice < volume.Slices; slice++) { MemoryStream ms = new MemoryStream(); BinaryWriter writer = new BinaryWriter(ms); int rows = volume.Rows; int cols = volume.Cols; for (int py = 0; py < rows; py++) { for (int px = 0; px < cols; px++) { writer.Write((short)((volume[slice, py, px] / 255f) * 4095)); } } writer.Close(); EvilDICOM.Core.DICOMObject obj = new EvilDICOM.Core.DICOMObject(new List <EvilDICOM.Core.Interfaces.IDICOMElement>() { new UnsignedShort(new Tag("0028", "0010"), (ushort)volume.Rows), new UnsignedShort(new Tag("0028", "0011"), (ushort)volume.Cols), new OtherByteString(TagHelper.PIXEL_DATA, ms.ToArray()) }); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } obj.Write(path + "\\slice" + slice + ".dcm"); } }
public static byte[,,] LoadFrom(string path) { byte[,,] data = null; var files = Directory.GetFiles(path, "*.dcm").OrderBy(f => new FileInfo(f).LastWriteTime).ToArray(); int slice = 0; short minim = byte.MaxValue; short maxim = byte.MinValue; foreach (var f in files) { EvilDICOM.Core.DICOMObject obj = EvilDICOM.Core.DICOMObject.Read(f); var rows = obj.TryGetDataValue <ushort>(new EvilDICOM.Core.Element.Tag("0028", "0010"), 0).SingleValue; var cols = obj.TryGetDataValue <ushort>(new EvilDICOM.Core.Element.Tag("0028", "0011"), 0).SingleValue; if (data == null) { data = new byte[1 << (int)Math.Ceiling(Math.Log(files.Length, 2)), rows, cols]; } BinaryReader br = new BinaryReader(obj.PixelStream); for (int py = 0; py < rows; py++) { for (int px = 0; px < cols; px++) { var value = br.ReadInt16(); data[slice, py, px] = (byte)(Math.Min(255, (value / 4095f) * 255)); data[slice, py, px] = Math.Min((byte)255, data[slice, py, px]); minim = Math.Min(minim, data[slice, py, px]); maxim = Math.Max(maxim, data[slice, py, px]); } } slice++; } return(data); }