• 关于

    实现可编辑的表格

    的搜索结果

问题

如何实现让一个区域变得可编辑?不用contentEditable、textarea的情况下。能否提示一下?谢谢

我想让一个表格或div区域变得可编辑,就像segementfault里面提问题的那个框那样,但是不用contentEditable、也不用textarea,请问该如何实现?js能否实现这个功能?...
杨冬芳 2019-12-01 20:08:04 1440 浏览量 回答数 1

问题

jquery实现可编辑表格时怎么在输入数值的同时就开始对行列求和的问题

就是边输入数值,同时动态的显示求和之后的结果,怎么监听,或者用其他事件就可以实现...
吴孟桥 2019-12-01 19:34:45 1023 浏览量 回答数 1

问题

Office与GoogleDrive实现集成带来的启发

       日前百会宣布旗下办公软件​百会 Office已经实现与 Google Drive( Google云端硬盘)的集成。 Google Drive 的用户可以调用百会 Office来编辑、创建、协作自己...
lailaihui 2019-12-01 20:20:13 4941 浏览量 回答数 0

问题

钉钉能否增加这个功能?

由于我的工作岗位关系,经常需要下级部门向我报送统计报表 虽然我公司有办公OA系统,但是该系统无法实现以下功能: 1、统计报表内容自定义(EXCEL表格形式,类目允许自定义...
icar 2019-12-01 21:15:15 2901 浏览量 回答数 0

问题

前端小白入门HTML基础 【新手百问合集】

HTML基础问答合集哦,希望对大家能有所帮助~ 求助html标签的基础问题 https://yq.aliyun.com/ask/13734 移动端touch的基础问题 https://yq.aliyun.com/ask/26...
马铭芳 2019-12-01 20:09:03 2532 浏览量 回答数 4

问题

常见问题

故障问题 Q: 打开界面看不到内容? A: 请您使用Chrome50 以上版本,谢谢! Q: 目前组件显示不正常,很多组件显示不全? A:请...
反向一觉 2019-12-01 21:00:19 1294 浏览量 回答数 0

问题

java 进销存 crm websocket即时聊天发图片文字 好友群组 SSM源码

fhadmin框架 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3 SSM 普通java ...
游客ydre72cd7ywew 2019-12-01 19:53:21 40 浏览量 回答数 0

问题

版本历史

Quick BI v2.2 新功能发布 1,新增HybridDB for MySQL 数据源 。 2,个人空间下新增可嵌入第三方系统报表的管理控制页面,用户可以自己新增嵌入第三方系统报表࿰...
反向一觉 2019-12-01 21:02:56 1049 浏览量 回答数 0

问题

ComponentOne2012v2版本已经正式发布了!

ComponentOne 2012 v2版本已经正式发布了!下面我将带您漫游 ComponentOne Ultimate的十大新特性。 第十大新特性 支持Visual Studio 2012 RC和Windows 8平...
zoezhou01 2019-12-01 20:55:02 8537 浏览量 回答数 0

问题

Activiti 工作流项目源码 代码生成器 websocket即时通讯 springmvc SS

工作流模块 1.模型管理 :web在线流程设计器、预览流程xml、导出xml、部署流程 2.流程管理 :导入导出流程资源文件、查看流程图、根据流程实例反射出流程模型、激活挂起 3.运行中流程:...
游客egqjd4t7mlyom 2019-12-01 19:54:26 50 浏览量 回答数 0

问题

Activiti6.0 java项目框架 spring5 SSM 工作流引擎 审批流程

工作流模块 1.模型管理 :web在线流程设计器、预览流程xml、导出xml、部署流程 2.流程管理 :导入导出流程资源文件、查看流程图、根据流程实例反射出流程模型、激活挂起 3.运行中流程:...
游客ydre72cd7ywew 2019-12-01 20:01:08 10 浏览量 回答数 0

问题

Activiti6.0 java项目框架 spring5 SSM 工作流引擎 审批流程

工作流模块 1.模型管理 :web在线流程设计器、预览流程xml、导出xml、部署流程 2.流程管理 :导入导出流程资源文件、查看流程图、根据流程实例反射出流程模型、激活挂起 3.运行中流程:...
游客q6uipubrszn5g 2019-12-01 19:59:18 27 浏览量 回答数 0

问题

MathML 介绍:报错

MathML 是一个 W3C 推荐标准,旨在为标记数学表达式定义一个 XML 词汇表。版本 1 作为一个 W3C 推荐标准发布于 1998 年,就在 XML 规范发布后不久。MathML 已作为推荐标准发布的另外...
kun坤 2020-06-08 11:09:17 2 浏览量 回答数 1

问题

Activiti6.0 java项目框架 spring5 SSM 工作流引擎 审批流程

工作流模块---------------------------------------------------------------------------------------------------------- 1.模型管理 ...
游客ydre72cd7ywew 2019-12-01 19:53:06 30 浏览量 回答数 0

问题

Activiti6.0 工作流引擎 websocket即时聊天发图片文字 好友群组 SSM源码

工作流模块---------------------------------------------------------------------------------------------------------- 1.模型管理 ...
游客q6uipubrszn5g 2019-12-01 19:57:13 37 浏览量 回答数 0

问题

MaxCompute用户指南:处理非结构化数据:访问OTS非结构化数据

表格存储(Table Store)是构建在阿里云飞天分布式系统之上的 NoSQL 数据存储服务,提供海量结构化数据的存储和实时访问。您可以通过 TableStore 文档 对其进行了解。 MaxC...
行者武松 2019-12-01 22:05:21 1162 浏览量 回答数 0

问题

仪表板基本操作

本章节将为您介绍如何进入仪表板,如何对数据集选择区,仪表板配置区和仪表板展示区进行基本的操作。 如果您想了解更多关于仪表板的基本概况,请参阅, 仪表板概述。 如果您想了解各种图表的制...
反向一觉 2019-12-01 21:03:51 1323 浏览量 回答数 0

问题

从"我的大盘"到"交互大盘"怎么是实现?

交互大盘 在2017年1月22号,ARMS发布了V2.2.0。其中一个重要的功能是”交互大盘”功能发布。交互大盘,顾名思义,即在大盘浏览中,增加了用户的动态交互功能,包...
猫饭先生 2019-12-01 21:24:33 1197 浏览量 回答数 0

问题

史上有哪些程序员实用工具网站?

目录 1、搜索引擎 2、PPT 3、图片操作 4、文件共享 5、应届生招聘 6、程序员面试题库 7、办公、开发软件 8、高清图片、视频素材网站  9、项目开源 10、算法 11、在线工具宝典大全 程序员开发需要具备良...
问问小秘 2020-03-14 23:11:50 4148 浏览量 回答数 2

问题

Web测试方法

在Web工程过程中,基于Web系统的测试、确认和验收是一项重要而富有挑战性的工作。基于Web的系统测试与传统的软件测试不同,它不但需要检查和验证是否按照设计的要求运行,而且还要测试系统在不同用户的浏...
技术小菜鸟 2019-12-01 21:41:32 7022 浏览量 回答数 1

问题

MaxCompute百问集锦(持续更新20171011)

大数据计算服务(MaxCompute,原名 ODPS)是一种快速、完全托管的 GB/TB/PB 级数据仓库解决方案。MaxCompute 向用户提供了完善的数据导入方案以及多种经典的分布式计算模型,能够更快速的解决用户海量数据计算问题,有效...
隐林 2019-12-01 20:19:23 38430 浏览量 回答数 18

回答

break; 11 case "0002,0013"://文件生成程序的标题 12 return "SH"; 13 break; 14 case "0008,0005"://文本编码 15 return "CS"; 16 break; 17 case "0008,0008": 18 return "CS"; 19 break; 20 case "0008,1032"://成像时间 21 return "SQ"; 22 break; 23 case "0008,1111": 24 return "SQ"; 25 break; 26 case "0008,0020"://检查日期 27 return "DA"; 28 break; 29 case "0008,0060"://成像仪器 30 return "CS"; 31 break; 32 case "0008,0070"://成像仪厂商 33 return "LO"; 34 break; 35 case "0008,0080": 36 return "LO"; 37 break; 38 case "0010,0010"://病人姓名 39 return "PN"; 40 break; 41 case "0010,0020"://病人id 42 return "LO"; 43 break; 44 case "0010,0030"://病人生日 45 return "DA"; 46 break; 47 case "0018,0060"://电压 48 return "DS"; 49 break; 50 case "0018,1030"://协议名 51 return "LO"; 52 break; 53 case "0018,1151": 54 return "IS"; 55 break; 56 case "0020,0010"://检查ID 57 return "SH"; 58 break; 59 case "0020,0011"://序列 60 return "IS"; 61 break; 62 case "0020,0012"://成像编号 63 return "IS"; 64 break; 65 case "0020,0013"://影像编号 66 return "IS"; 67 break; 68 case "0028,0002"://像素采样1为灰度3为彩色 69 return "US"; 70 break; 71 case "0028,0004"://图像模式MONOCHROME2为灰度 72 return "CS"; 73 break; 74 case "0028,0010"://row高 75 return "US"; 76 break; 77 case "0028,0011"://col宽 78 return "US"; 79 break; 80 case "0028,0100"://单个采样数据长度 81 return "US"; 82 break; 83 case "0028,0101"://实际长度 84 return "US"; 85 break; 86 case "0028,0102"://采样最大值 87 return "US"; 88 break; 89 case "0028,1050"://窗位 90 return "DS"; 91 break; 92 case "0028,1051"://窗宽 93 return "DS"; 94 break; 95 case "0028,1052": 96 return "DS"; 97 break; 98 case "0028,1053": 99 return "DS"; 100 break; 101 case "0040,0008"://文件夹标签 102 return "SQ"; 103 break; 104 case "0040,0260"://文件夹标签 105 return "SQ"; 106 break; 107 case "0040,0275"://文件夹标签 108 return "SQ"; 109 break; 110 case "7fe0,0010"://像素数据开始处 111 return "OW"; 112 break; 113 default: 114 return "UN"; 115 break; 116 } 117 } 复制代码 最关键的两个tag: 0002,0010 普通tag的读取方式 little字节序还是big字节序 隐式VR还是显示VR。由它的值决定 复制代码 1 switch (VFStr) 2 { 3 case "1.2.840.10008.1.2.10"://显示little 4 isLitteEndian = true; 5 isExplicitVR = true; 6 break; 7 case "1.2.840.10008.1.2.20"://显示big 8 isLitteEndian = false; 9 isExplicitVR = true; 10 break; 11 case "1.2.840.10008.1.20"://隐式little 12 isLitteEndian = true; 13 isExplicitVR = false; 14 break; 15 default: 16 break; 17 } 复制代码 7fe0,0010 像素数据开始处 整理 根据以上的分析相信解析一个dicom格式文件的过程已经很清晰了吧 第一步:跳过128字节导言部分,并读取"DICM"4个字符 以确认是dicom格式文件 第二步:读取第一部分 也就是非常重要的文件元dataElement 。读取所有0002开头的tag 并根据0002,0010的值确定传输语法。文件元tag部分的数据元素都是以显示VR的方式表示的 读取它的值 也就是字节码处理 别告诉我说你不会字节码处理哈。传输语法 说得那么官方,你就忽悠吧 其实就确定两个东西而已 1字节序 这个基本上都是little字节序。举个例子吧十进制数 35280 用十六进制表示是0xff00 但是存储到文件中你用十六进制编辑器打开你看到的是这个样子00ff 这就是little字节序。平常我们用的x86PC在windows下都是little字节序 包括AMD的CPU。别太较真 较真的话这个问题又可以写篇博客了。 2确定从0002以后的dataElement的VR是显示还是隐式。说来说去0002,0010的值就 那么固定几个 并且只能是那么几个 这些都在那个北美放射学会定义的dicom标准的第六章 有说明 : 1.2.840.10008.1.2 Implicit VR Little Endian: Default Transfer Syntax for DICOM Transfer Syntax 1.2.840.10008.1.2.1 Explicit VR Little Endian Transfer Syntax 1.2.840.10008.1.2.2 Explicit VR Big Endian Transfer Syntax 上面的那段代码其实就是这个表格的实现,讲到这里你会觉得多么的坑爹啊 是的dicom面向对象的破概念非常烦的。 第三步:读取普通tag 直到搜寻到7fe0,0010 这个最巨体的存储图像数据的 dataElement 它一个顶别人几十个 上百个。我们在前一步已经把VR是显示还是隐式确定 通过前面的图 ,也就是字节码处理而已无任何压力。显示情况下根据VR 和Len 确定数据类型 跟数据长度直接读取就可以了。隐式情况下这破玩艺儿有点烦,只能根据tag 字典确定它是什么VR再才能读取。关于这个字典也在dicom标准的第六章。上面倒数第二段代码已经把重要的字典都列了出来。 第四步:读取灰度像素数据并调窗 以GDI的方式显示出来。 说实话开始我还以为dicom这种号称医学什么影像的专家制定出来的标准 读取像素数据应该有难度吧 结果没想到这么的傻瓜。直接按像素从左到右从上到下 一行行依次扫描。两个字节表示1个像素普通Dicom格式存储的是16位的灰度图像,其实有效数据只有12位,除去0 所以最高值是2047。比如CT值 从-1000到+1000,空气的密度为-1000 水的密度为0 金属的密度为+1000 总共的值为2000 调窗技术: 即把12级灰度的数据 通过调节窗宽窗位并让他在RGB模式下显示出来。还技术呢 说实话这个也是没什么技术含量的所谓的技术,两句代码给你整明白。 调节窗宽窗位到底什么意思,12位的数据那么它总共有2047个等级的灰度 没有显示设备可以体现两千多级的明暗度 就算有我们肉眼也无法分辨更无法诊断。我们要诊断是要提取关键密度值的数据 在医院放射科呆久了你一定经常听医生讲什么骨窗 肺窗 之类的词儿,这就是指的这个“窗”。比如有病人骨折了打了钢板我们想看金属部分来诊断 那么我们应该抓取CT值从800到1000 密度的像素 也就是灰度值 然后把它放到RGB模式下显示,低于800的不论值大小都显示黑色 高于1000的不论值大小都显示白色。 通过以上例子那么这个范围1000-800=200 这个200表示窗宽,800+(200/2)这个表示窗位 一句话,从2047个等级的灰度里选取一个范围放到0~255的灰度环境里显示。 怎样把12位灰度影射到8位灰度显示出来呢,还怎么显示 上面方法都给说明了基本上算半成品了。联想到角度制弧度制,设要求的8位灰度值为x 已知的12位灰度值为y那么:x/255=y/2047 那么x=255y/2047 原理不多讲 等比中项十字相乘法 这个是初中的知识哈。初中没读过的童鞋飘过。。。 原理过程讲完了 代码走起 复制代码 1 class DicomHandler 2 { 3 string fileName = ""; 4 Dictionary tags = new Dictionary();//dicom文件中的标签 5 BinaryReader dicomFile;//dicom文件流 6 7 //文件元信息 8 public Bitmap gdiImg;//转换后的gdi图像 9 UInt32 fileHeadLen;//文件头长度 10 long fileHeadOffset;//文件数据开始位置 11 UInt32 pixDatalen;//像素数据长度 12 long pixDataOffset = 0;//像素数据开始位置 13 bool isLitteEndian = true;//是否小字节序(小端在前 、大端在前) 14 bool isExplicitVR = true;//有无VR 15 16 //像素信息 17 int colors;//颜色数 RGB为3 黑白为1 18 public int windowWith = 2048, windowCenter = 2048 / 2;//窗宽窗位 19 int rows, cols; 20 public void readAndShow(TextBox textBox1) 21 { 22 if (fileName == string.Empty) 23 return; 24 dicomFile = new BinaryReader(File.OpenRead(fileName)); 25 26 //跳过128字节导言部分 27 dicomFile.BaseStream.Seek(128, SeekOrigin.Begin); 28 29 if (new string(dicomFile.ReadChars(4)) != "DICM") 30 { 31 MessageBox.Show("没有dicom标识头,文件格式错误"); 32 return; 33 } 34 35 36 tagRead(); 37 38 IDictionaryEnumerator enor = tags.GetEnumerator(); 39 while (enor.MoveNext()) 40 { 41 if (enor.Key.ToString().Length > 9) 42 { 43 textBox1.Text += enor.Key.ToString() + "rn"; 44 textBox1.Text += enor.Value.ToString().Replace('0', ' '); 45 } 46 else 47 textBox1.Text += enor.Key.ToString() + enor.Value.ToString().Replace('0', ' ') + "rn"; 48 } 49 dicomFile.Close(); 50 } 51 public DicomHandler(string _filename) 52 { 53 fileName = _filename; 54 } 55 56 public void saveAs(string filename) 57 { 58 switch (filename.Substring(filename.LastIndexOf('.'))) 59 { 60 case ".jpg": 61 gdiImg.Save(filename, System.Drawing.Imaging.ImageFormat.Jpeg); 62 break; 63 case ".bmp": 64 gdiImg.Save(filename, System.Drawing.Imaging.ImageFormat.Bmp); 65 break; 66 case ".png": 67 gdiImg.Save(filename, System.Drawing.Imaging.ImageFormat.Png); 68 break; 69 default: 70 break; 71 } 72 } 73 public bool getImg( )//获取图像 在图像数据偏移量已经确定的情况下 74 { 75 if (fileName == string.Empty) 76 return false; 77 78 int dataLen, validLen;//数据长度 有效位 79 int imgNum;//帧数 80 81 rows = int.Parse(tags["0028,0010"].Substring(5)); 82 cols = int.Parse(tags["0028,0011"].Substring(5)); 83 84 colors = int.Parse(tags["0028,0002"].Substring(5)); 85 dataLen = int.Parse(tags["0028,0100"].Substring(5)); 86 validLen = int.Parse(tags["0028,0101"].Substring(5)); 87 88 gdiImg = new Bitmap(cols, rows); 89 90 BinaryReader dicomFile = new BinaryReader(File.OpenRead(fileName)); 91 92 dicomFile.BaseStream.Seek(pixDataOffset, SeekOrigin.Begin); 93 94 long reads = 0; 95 for (int i = 0; i < gdiImg.Height; i++) 96 { 97 for (int j = 0; j < gdiImg.Width; j++) 98 { 99 if (reads >= pixDatalen) 100 break; 101 byte[] pixData = dicomFile.ReadBytes(dataLen / 8 * colors); 102 reads += pixData.Length; 103 104 Color c = Color.Empty; 105 if (colors == 1) 106 { 107 int grayGDI; 108 109 double gray = BitConverter.ToUInt16(pixData, 0); 110 //调窗代码,就这么几句而已 111 //1先确定窗口范围 2映射到8位灰度 112 int grayStart = (windowCenter - windowWith / 2); 113 int grayEnd = (windowCenter + windowWith / 2); 114 115 if (gray < grayStart) 116 grayGDI = 0; 117 else if (gray > grayEnd) 118 grayGDI = 255; 119 else 120 { 121 grayGDI = (int)((gray - grayStart) * 255 / windowWith); 122 } 123 124 if (grayGDI > 255) 125 grayGDI = 255; 126 else if (grayGDI < 0) 127 grayGDI = 0; 128 c = Color.FromArgb(grayGDI, grayGDI, grayGDI); 129 } 130 else if (colors == 3) 131 { 132 c = Color.FromArgb(pixData[0], pixData[1], pixData[2]); 133 } 134 135 gdiImg.SetPixel(j, i, c); 136 } 137 } 138 139 dicomFile.Close(); 140 return true; 141 } 142 void tagRead()//不断读取所有tag 及其值 直到碰到图像数据 (7fe0 0010 ) 143 { 144 bool enDir = false; 145 int leve = 0; 146 StringBuilder folderData = new StringBuilder();//该死的文件夹标签 147 string folderTag = ""; 148 while (dicomFile.BaseStream.Position + 6 < dicomFile.BaseStream.Length) 149 { 150 //读取tag 151 string tag = dicomFile.ReadUInt16().ToString("x4") + "," + 152 dicomFile.ReadUInt16().ToString("x4"); 153 154 string VR = string.Empty; 155 UInt32 Len = 0; 156 //读取VR跟Len 157 //对OB OW SQ 要做特殊处理 先置两个字节0 然后4字节值长度 158 //------------------------------------------------------这些都是在读取VR一步被阻断的情况 159 if (tag.Substring(0, 4) == "0002")//文件头 特殊情况 160 { 161 VR = new string(dicomFile.ReadChars(2)); 162 163 if (VR == "OB" || VR == "OW" || VR == "SQ" || VR == "OF" || VR == "UT" || VR == "UN") 164 { 165 dicomFile.BaseStream.Seek(2, SeekOrigin.Current); 166 Len = dicomFile.ReadUInt32(); 167 } 168 else 169 Len = dicomFile.ReadUInt16(); 170 } 171 else if (tag == "fffe,e000" || tag == "fffe,e00d" || tag == "fffe,e0dd")//文件夹标签 172 { 173 VR = "**"; 174 Len = dicomFile.ReadUInt32(); 175 } 176 else if (isExplicitVR == true)//有无VR的情况 177 { 178 VR = new string(dicomFile.ReadChars(2)); 179 180 if (VR == "OB" || VR == "OW" || VR == "SQ" || VR == "OF" || VR == "UT" || VR == "UN") 181 { 182 dicomFile.BaseStream.Seek(2, SeekOrigin.Current); 183 Len = dicomFile.ReadUInt32(); 184 } 185 else 186 Len = dicomFile.ReadUInt16(); 187 } 188 else if (isExplicitVR == false) 189 { 190 VR = getVR(tag);//无显示VR时根据tag一个一个去找 真烦啊。 191 Len = dicomFile.ReadUInt32(); 192 } 193 //判断是否应该读取VF 以何种方式读取VF 194 //-------------------------------------------------------这些都是在读取VF一步被阻断的情况 195 byte[] VF = { 0x00 }; 196 197 if (tag == "7fe0,0010")//图像数据开始了 198 { 199 pixDatalen = Len; 200 pixDataOffset = dicomFile.BaseStream.Position; 201 dicomFile.BaseStream.Seek(Len, SeekOrigin.Current); 202 VR = "UL"; 203 VF = BitConverter.GetBytes(Len); 204 } 205 else if ((VR == "SQ" && Len == UInt32.MaxValue) || (tag == "fffe,e000" && Len == UInt32.MaxValue))//靠 遇到文件夹开始标签了 206 { 207 if (enDir == false) 208 { 209 enDir = true; 210 folderData.Remove(0, folderData.Length); 211 folderTag = tag; 212 } 213 else 214 { 215 leve++;//VF不赋值 216 } 217 } 218 else if ((tag == "fffe,e00d" && Len == UInt32.MinValue) || (tag == "fffe,e0dd" && Len == UInt32.MinValue))//文件夹结束标签 219 { 220 if (enDir == true) 221 { 222 enDir = false; 223 } 224 else 225 { 226 leve--; 227 } 228 } 229 else 230 VF = dicomFile.ReadBytes((int)Len); 231 232 string VFStr; 233 234 VFStr = getVF(VR, VF); 235 236 //----------------------------------------------------------------针对特殊的tag的值的处理 237 //特别针对文件头信息处理 238 if (tag == "0002,0000") 239 { 240 fileHeadLen = Len; 241 fileHeadOffset = dicomFile.BaseStream.Position; 242 } 243 else if (tag == "0002,0010")//传输语法 关系到后面的数据读取 244 { 245 switch (VFStr) 246 { 247 case "1.2.840.10008.1.2.10"://显示little 248 isLitteEndian = true; 249 isExplicitVR = true; 250 break; 251 case "1.2.840.10008.1.2.20"://显示big 252 isLitteEndian = false; 253 isExplicitVR = true; 254 break; 255 case "1.2.840.10008.1.20"://隐式little 256 isLitteEndian = true; 257 isExplicitVR = false; 258 break; 259 default: 260 break; 261 } 262 } 263 for (int i = 1; i <= leve; i++) 264 tag = "--" + tag; 265 //------------------------------------数据搜集代码 266 if ((VR == "SQ" && Len == UInt32.MaxValue) || (tag == "fffe,e000" && Len == UInt32.MaxValue) || leve > 0)//文件夹标签代码 267 { 268 folderData.AppendLine(tag + "(" + VR + "):" + VFStr); 269 } 270 else if (((tag == "fffe,e00d" && Len == UInt32.MinValue) || (tag == "fffe,e0dd" && Len == UInt32.MinValue)) && leve == 0)//文件夹结束标签 271 { 272 folderData.AppendLine(tag + "(" + VR + "):" + VFStr); 273 tags.Add(folderTag + "SQ", folderData.ToString()); 274 } 275 else 276 tags.Add(tag, "(" + VR + "):" + VFStr); 277 } 278 } 279 } 复制代码 好了收工。 测试下成果 复制代码 1 if (openFileDialog1.ShowDialog() != DialogResult.OK) 2 return; 3 4 string fileName = openFileDialog1.FileName; 5 6 handler = new DicomHandler(fileName); 7 8 handler.readAndShow(textBox1); 9 10 this.Text = "DicomViewer-" + openFileDialog1.FileName; 11 12 13 backgroundWorker1.RunWorkerAsync(); 复制代码 这里处理gdi位图的时候直接用的setPix 处理速度比较慢所以用了backgroundWorker,实际应用中请使用内存缓冲跟指针的方式 否则效率低了是得不到客户的认可的哦,gdi位图操作可使用lockBits加指针的方式 ,12位的灰度像素数据可以第一次读取后缓存到内存中 以方便后面调窗的快速读取 优化这点代码也不难哈 对指针什么的熟点就行了,前几章都有。 这是ezDicom 经过公认测试的软件 我们来跟他对比一下,打开 调窗测试,我们注意到两个东西 在没有窗宽窗位时 默认窗宽是2047+1即2048 窗位是2048/2即1024 直观的感受是调窗宽像在调图像对比度 ,调窗位像在调图像亮度。 窗宽为255的时候图像是最瑞丽的 因为255其实就是8位图像的默认窗宽。 注意窗位那里有小小区别,ez窗位显示的是根据1024那里为0开始偏移 而我的程序是根据窗宽中间值没有偏移 没有偏移的情况稍微符合逻辑点吧。 但是可以看到原理是一样的 结果是一样的。
爵霸 2019-12-02 02:13:35 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 企业建站模板