ClearCanvas DICOM 开发系列 一

摘要:
C#开源DICOM服务器概述它支持图像处理、图像归档、图像管理、图像传输和图像浏览功能。有很多地方可以从开源代码中学习。

概述

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

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

building ImageViewer 的代码,

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

2、运行ClearCanvas.Desktop.Executable Bin\debug 或Bin\Release下的项目.

  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,可以在Bin\Log 看到开启后的日志.

结果如下

image

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

image

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

[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的话也可以这样

    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;
        }
    }

欢迎各位参与讨论,如果觉得对你有帮助,请点击image    推荐下,万分谢谢.

作者:spring yang

出处:http://www.cnblogs.com/springyangwc/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

免责声明:文章转载自《ClearCanvas DICOM 开发系列 一》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇junit私有方法测试网站开启https后加密协议始终是TLS1.0如何配置成TLS1.2?下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

DICOM:Transfer Syntax传输语义之奇葩GE Private TS

背景:专栏之前对Transfer Syntax(暂定中文翻译为传输语义,8月初博客中提到的DICOM3.0标准中文版开源书籍计划顺利启动。兴许会面临诸多专有名词的翻译工作,欢迎广大博友提意见)进行过多次的介绍。在DICOM医学图像处理:DICOM网络传输中差别过Abstract Syntax与Transfer Syntax,在DICOM:dcmqrscp...

DICOM文件修改方法

/// <summary> /// 读取dicom文件 /// </summary> /// <param name="srcdirectory"></param> /// <param name="desdirectory"></param> public static void R...

DICOM文件添加私有Tag(DCMTK Private Tag)

                                                                                         DICOM文件插入私有tag   在处理dicom文件过程中,往往需要插入自定义的tag,并保存为dicom文件。在网上查资料,都比较少,经过一番探索,有点收获。与大家分享,希望能...

[转]常见医疗扫描图像处理步骤

一 数据格式 1.1 dicom DICOM是医学图像中标准文件,这些文件包含了诸多的元数据信息(比如像素尺寸,每个维度的一像素代表真实世界里的长度)。此处以kaggle Data Science Bowl 数据集为例。 data-science-bowl-2017。数据列表如下: 后缀为 .dcm。 每个病人的一次扫描CT(scan)可能有几十到一百多...

安装dcm4chee-arc-light-5.4.1-mysql步骤

一.进入网址: https://github.com/dcm4che/dcm4chee-arc-light/wiki/Installation这个是GitHub上面给的步骤,可能会比较难理解,按照所给的步骤做,可能会出现各种问题,在此将笔者遇见的问题列举出来,并给出解决方案。 二.安装所需环境: 1、JDK 1.8.0_912、wildfly-10.0...