zoukankan      html  css  js  c++  java
  • ClearCanvas DICOM 开发系列 一

    概述

    C#开源的DICOM server.支持影像处理、影像归档、影像管理、影像传输和影像浏览功能。开源代码可学习地方很多。

    官方网站:http://www.clearcanvas.ca

    building ImageViewer 的代码,

    1、打开ImageViewer.sln 在 /Trunk/ImageViewer 用VS2008编译它.

    2、运行ClearCanvas.Desktop.Executable Bindebug 或BinRelease下的项目.

    1. 编译通过ImageServer.sln 在 /Trunk/ImageServer
    2. 修改 connectionStringsImageServer_Shreds_dist.config 的user 和 password 在你安装了ImageServer数据库后.
    3. 编辑/Trunk/ImageServer/Executable/Logging.config 的ConnectionString 的 user 和 password .
    4. 编译通过这个项目
    5. 开启 ClearCanvas.ImageServer.ShredHostService ,运行里面的wcf server,可以在BinLog 看到开启后的日志.

    结果如下

    image

    运行 ClearCanvas.Desktop.Executable 的结果如下

    image

    测试往Server加入.dcm文件的代码如下 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    [TestFixture]
        public class ScuTests : AbstractTest
        {
            [TestFixtureSetUp]
            public void Init()
            {
                _serverType = TestTypes.Receive;
            }
     
            [TestFixtureTearDown]
            public void Cleanup()
            {
            }
     
            TestTypes _serverType;
     
            public IDicomServerHandler ServerHandlerCreator(DicomServer server, ServerAssociationParameters assoc)
            {
                return new ServerHandler(this, _serverType);
            }
     
            private StorageScu SetupScu()
            {
                StorageScu scu = new StorageScu("TestAe", "AssocTestServer", "localhost", 104);
     
                IList<DicomAttributeCollection> list = SetupMRSeries(4, 2, DicomUid.GenerateUid().UID);
     
                foreach (DicomAttributeCollection collection in list)
                {
                    DicomFile file = new DicomFile("test", new DicomAttributeCollection(), collection);
                    file.TransferSyntax = TransferSyntax.ExplicitVrLittleEndian;
                    file.MediaStorageSopClassUid = SopClass.MrImageStorage.Uid;
                    file.MediaStorageSopInstanceUid = collection[DicomTags.SopInstanceUid].ToString();
     
                    scu.AddStorageInstance(new StorageInstance(file));
                }
     
                return scu;
            }
     
            [Test]
            public void ScuAbortTest()
            {
                int port = 2112;
     
                /* Setup the Server */
                ServerAssociationParameters serverParameters = new ServerAssociationParameters("AssocTestServer", new IPEndPoint(IPAddress.Any, port));
                byte pcid = serverParameters.AddPresentationContext(SopClass.MrImageStorage);
                serverParameters.AddTransferSyntax(pcid, TransferSyntax.ExplicitVrLittleEndian);
                serverParameters.AddTransferSyntax(pcid, TransferSyntax.ExplicitVrBigEndian);
                serverParameters.AddTransferSyntax(pcid, TransferSyntax.ImplicitVrLittleEndian);
     
                _serverType = TestTypes.Receive;
                DicomServer.StartListening(serverParameters, ServerHandlerCreator);
     
                StorageScu scu = SetupScu();
     
                IList<DicomAttributeCollection> list = SetupMRSeries(4, 2, DicomUid.GenerateUid().UID);
     
                foreach (DicomAttributeCollection collection in list)
                {
                    DicomFile file = new DicomFile("test",new DicomAttributeCollection(),collection );
                    file.TransferSyntax = TransferSyntax.ExplicitVrLittleEndian;
                    file.MediaStorageSopClassUid = SopClass.MrImageStorage.Uid;
                    file.MediaStorageSopInstanceUid = collection[DicomTags.SopInstanceUid].ToString();
     
                    scu.AddStorageInstance(new StorageInstance(file));
                }
     
                scu.ImageStoreCompleted += delegate(object o, StorageInstance instance)
                                            {
                                                // Test abort
                                                scu.Abort();
                                            };
     
                scu.Send();
                scu.Join();
     
                Assert.AreEqual(scu.Status, ScuOperationStatus.NetworkError);
     
                // StopListening
                DicomServer.StopListening(serverParameters);
            }
        }

    如果直接是filePath的话也可以这样

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    public class ImageStoreDAL
    {
        private ConnectModel _connectModel;
     
        public ImageStoreDAL(ConnectModel connectModel)
        {
            _connectModel = connectModel;
        }
     
        public ConnectModel ConnectModelInstance
        {
            get { return _connectModel; }
            set { _connectModel = value; }
        }
     
        private StorageScu SetupScu(string filePath)
        {
            StorageScu scu = new StorageScu(_connectModel.ClientAETitle, _connectModel.RemoteAE, _connectModel.RemoteHost, _connectModel.RemotePort);
            DicomFile file = new DicomFile(filePath);
            scu.AddStorageInstance(new StorageInstance(file));
            return scu;
        }
     
        public ScuOperationStatus ImageStoreByFilePath(string filePath)
        {
            StorageScu scu = SetupScu(filePath);
            scu.Send();
            return scu.Status;
        }
    }
  • 相关阅读:
    设计模式单例模式的实现方式
    Springboot,SSM框架比较,区别
    多线程系列之自己实现一个 lock 锁
    springBoot 自动配置原理自己新建一个 starter
    Hashmap 实现方式 jdk1.7 和 1.8区别
    给WPF中的DataGrid控件添加右键菜单(ContextMenu),以便用户可以显示或者隐藏DataGrid中的列,并且下次运行时依然保持上次关闭时的列的布局
    WPF XAML页面 无智能感知
    【读书笔记】排列研究排列中的代数组合学
    使用Mathematica做序列的DTFT的几个例子
    BGF bivariate generating function 双变量生成函数
  • 原文地址:https://www.cnblogs.com/h2zZhou/p/5956596.html
Copyright © 2011-2022 走看看