示例#1
0
        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");
            }
        }
示例#2
0
        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);
        }