C#开发PACS医学影像处理系统(十):Dicom影像下载策略与算法

1.传输协议html

当咱们PACS客户端接收到下载命令时须要根据dcm文件的url来下载,这里推荐使用http协议,支持大文件的断点续传。算法

2.下载策略服务器

假设有10个序列,每一个序列有100张图像,微信

①广度优先:将任务池中的下载任务平均分配到10个序列,每一个序列都同时下载,网络

优势:是每一个序列都能分布加载,当用户切换序列到单元格时不须要等待。架构

缺点:当图像特别多的时候,好比CT薄层,序列切换图像滚动时显示不完整。并发

②深度优先:将任务池中的下载任务根据先进先出原则分配到排序在前的序列,下载完一个后再开始下一个。机器学习

优势和缺点刚好和广度优先策略相反。高并发

 

 

那么鱼和熊掌能不能兼得呢?能。工具

默认使用广度优先,当用户点击某个序列时,通常认为是用户优先想看的序列,

则为该序列加速,该序列视为特殊加速序列,下载任务排满,其余序列仍然是平均分配。

 

看效果:

 

 

最后附上http下载的关键代码:

     /// <summary>
        /// 下载文件
        /// </summary>
        /// <param name="url">下载地址</param>
        /// <param name="path">本地路径</param>
        public static bool DownLoadFile(string url, string path)
        {bool flag = false;
            long SPosition = 0;
            FileStream FStream = null;
            Stream myStream = null;

            try
            {
                //判断要下载的文件是否存在
                if (File.Exists(path))
                {
                    //打开上次下载的文件
                    FStream = File.OpenWrite(path);
                    //获取已经下载的长度
                    SPosition = FStream.Length;
                    long serverFileLength = GetHttpLength(url);
                    if (serverFileLength == -1)
                    {
                        //本地文件
                        return true;
                    }
                    if (serverFileLength == 0)
                    {
                        return false;
                    }
                    if (SPosition == serverFileLength)
                    {
                        //文件是完整的,直接结束下载任务
                        return true;
                    }
                    if (SPosition > serverFileLength)
                    {
                        SPosition = 0;
                        FStream.Seek(0, SeekOrigin.Current);
                    }
                    else
                    {
                        FStream.Seek(SPosition, SeekOrigin.Current);
                    }
                }
                else
                {
                    FStream = new FileStream(path, FileMode.Create);
                    SPosition = 0;
                }

                //打开网络链接
                HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(url);
                if (SPosition > 0)
                {
                    //设置Range值
                    myRequest.AddRange(SPosition);
                }
                //向服务器请求,得到服务器的回应数据流
                myStream = myRequest.GetResponse().GetResponseStream();
                //定义一个字节数据
                byte[] btContent = new byte[512];
                int intSize = 0;
                intSize = myStream.Read(btContent, 0, 512);
                while (intSize > 0)
                {
                    FStream.Write(btContent, 0, intSize);
                    intSize = myStream.Read(btContent, 0, 512);
                }
                flag = true;
            }
            catch (Exception ex)
            {
                flag = false;
                LogApi.WriteLog("下载文件时异常:" + path);
                LogApi.WriteErrLog(ex);
            }
            finally
            {
                //关闭流
                if (myStream != null)
                {
                    myStream.Close();
                    myStream.Dispose();
                }
                if (FStream != null)
                {
                    FStream.Close();
                    FStream.Dispose();
                }
            }
            return flag;
        }

 

 

C#开发PACS、RIS、3D医学影像处理系统系列教程目录整理:

菜鸟入门篇:

PACS客户端:

C#开发PACS医学影像处理系统(一):开发背景和功能预览

C#开发PACS医学影像处理系统(二):界面布局之菜单栏

C#开发PACS医学影像处理系统(三):界面布局之工具栏

C#开发PACS医学影像处理系统(四):界面布局之状态栏

C#开发PACS医学影像处理系统(五):查询病人信息列表

C#开发PACS医学影像处理系统(六):加载Dicom影像

C#开发PACS医学影像处理系统(七):读取影像Dicom信息

C#开发PACS医学影像处理系统(八):单元格变换

C#开发PACS医学影像处理系统(九):序列控件与拖拽

C#开发PACS医学影像处理系统(十):Dicom影像下载策略与算法

C#开发PACS医学影像处理系统(十一):Dicom影像挂片协议

C#开发PACS医学影像处理系统(十二):绘图处理之图形标记

C#开发PACS医学影像处理系统(十三):绘图处理之病灶测量

C#开发PACS医学影像处理系统(十四):处理Dicom影像窗宽窗位

C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法

C#开发PACS医学影像处理系统(十六):2D处理之影像平移和缩放

C#开发PACS医学影像处理系统(十七):2D处理之影像旋转和翻转

C#开发PACS医学影像处理系统(十八):Dicom使用LUT色彩加强和反色

C#开发PACS医学影像处理系统(十九):Dicom影像放大镜

 

PACS三维处理医学图像:

C#开发PACS医学影像三维重建(一):使用VTK重建3D影像

C#开发PACS医学影像三维重建(二):使用VTK进行体绘制

C#开发PACS医学影像三维重建(三):纹理映射与颜色传输

C#开发PACS医学影像三维重建(四):3D网格平滑效果

C#开发PACS医学影像三维重建(五):基于梯度透明的组织漫游

C#开发PACS医学影像三维重建(六):三维光源与阴影效果

C#开发PACS医学影像三维重建(七):空间测量与标注

C#开发PACS医学影像三维重建(八):VR体绘制

C#开发PACS医学影像三维重建(九):MPR三视图切面重建

C#开发PACS医学影像三维重建(十):MIP最小密度投影

C#开发PACS医学影像三维重建(十一):CPR曲面重建

C#开发PACS医学影像三维重建(十二):VE虚拟内镜技术

 

熟手进阶篇:

医学图像算法:

C#处理医学图像(一):基于Hessian矩阵的血管肺纹理骨骼加强对比

C#处理医学图像(二):图像锐化加强对比

 

PACS网页端 开发Web版本的PACS:

C#开发Web端PACS(一):基于PACS客户端思想重写Web端

C#开发Web端PACS(二):使用 .Net MVC 开发手机端PACS服务端

C#开发Web端PACS(三):使用HTML5和CSS3开发PACS手机端页面

C#开发Web端PACS(四):Web端与服务端的DICOM传输

C#开发Web端PACS(五):Web端的平移缩放旋转2D操做

C#开发Web端PACS(六):Web端的窗宽窗位调整

C#开发Web端PACS(七):将移动端接入微信公众号实现医院云胶片

 

登峰造极篇:

C#开发基于Python人工智能的肺结节自动检测

C#开发基于Python人工智能的脊柱侧弯曲率算法

C#开发基于Python机器学习的医学影像骨骼仿真动画

C#开发基于Python机器学习的术后恢复模拟

C#开发基于U3D的VR眼镜设备虚拟人体三维重建

C#开发基于全息投影的裸眼3D医学影像显示技术

 

周边附加篇:

胶片打印:

C#开发医学影像胶片打印系统(一):功能与胶片排版

C#开发医学影像胶片打印系统(二):胶片打印机通信

C#开发医学影像胶片打印系统(三):不规则排版打印

 

PACS服务端:

C#开发PACS医学影像处理系统服务端(一):医疗设备的链接与收图

C#开发PACS医学影像处理系统服务端(二):高并发架构

 

PACS与RIS系统的通讯与集成

在RIS系统中调起PACS并打开Dicom影像

 

云PACS与远程会诊

C#开发PACS医学影像处理系统之云PACS(区域PACS)(一):架构概述

C#开发PACS医学影像处理系统之云PACS(区域PACS)(二):远程会诊与双向转诊

 

科幻级视频特效:

使用Adobe After Effects 制做PACS影像处理系统宣传视频

 

QQ:1850969244

近10年开发经验,主攻C#、ASP MVC,HTML5,

B/S C/S 皆可,目前研究医疗领域医学影像相关技术,

任何技术问题欢迎加QQ交流。