当前位置: 首页 > news >正文

织梦网站怎么做索引地图文件关键词搜索工具

织梦网站怎么做索引地图,文件关键词搜索工具,新疆和田市建设局网站,免费python教程🍀 引言 当我们刚接触Cornerstone或拿到一组Dicom文件时,如果没有ImageID和后台接口,可能只是想简单测试Cornerstone能否加载这些Dicom文件。在这种情况下,可以使用本地文件加载的方法。之前我们介绍了通过node启动服务器请求文件…

🍀 引言

当我们刚接触Cornerstone或拿到一组Dicom文件时,如果没有ImageID和后台接口,可能只是想简单测试Cornerstone能否加载这些Dicom文件。在这种情况下,可以使用本地文件加载的方法。之前我们介绍了通过node启动服务器请求文件,在本地提供接口的方式。今天,我们再介绍一下另一种实现方式——直接使用文件输入框点击上传文件,通过文件流让Cornerstone加载并渲染这些Dicom文件。以下将围绕实现效果、实现思路及具体流程展开。

🔥 效果速览

本篇整体相关代码已更新至代码库:https://github.com/jianyaoo/vue-cornerstone-demo/blob/main/src/views/basicUsage/LocalFile.vue,欢迎Star。
实现效果如下:
请添加图片描述

⛳️ 具体实现流程

实现流程

我们想要通过点击input文件框上传本地的文件进行渲染,在进行实际开发前,我们先梳理一下大概的思路:

  1. 需要一个 type 为file 的 input 输入框组件,点击上传选择本地要渲染的Dicom文件

  2. 我们可能想要展示一张Dicom或者一组Dicom文件,所以 input 需要设置多选属性

  3. 监听文件更改事件,当上传文件后进行渲染

  4. 将本地上传的file文件流传递给Cornerstone进行渲染(核心步骤,Cornerstone如何渲染Blob文件流

按照上面的流程,我们就开始准备写代码

UI组件

<div class="form"><label for="">点击上传文件:</label><inputtype="file"multiple@change="handleChange">
</div>

监听文件改变

function handleChange(evt) {// 阻止事件冒泡evt.stopPropagation();// 阻止默认事件evt.preventDefault();// 更新文件前清除之前的缓存,避免更新上传文件时直接从缓存中获取Volume对象cache.purgeCache();const files = evt.target.files;const imageIds = [];Array.from(files).forEach(file => {// 将文件流放到dicomLoader的文件管理器中并返回对应的ImageID => Blob流加载的核心代码1const imageId = cornerstoneDICOMImageLoader.wadouri.fileManager.add(file);imageIds.push(imageId);});// 渲染ImageidloadAndViewImage(imageIds);
}

在监听文件改变的代码中,核心代码主要有2点:

  • 在每次更新文件时进行缓存清除:cache.purgeCache(),避免再次上传文件时由于VolumeId没有改变而导致直接从缓存中获取数据

  • 获取到file文件流后,可以通过 cornerstoneDICOMImageLoader 的fileManager对象将文件流转换成ImageId,我们可以看一下fileManager中的相关方法,通过add方法将我们上传的文件流添加到文件列表中,并获取到以 dicomfile 为前缀的ImageId

// 单例文件列表,用于管理上传的文件列表
let files: Blob[] = [];// add:向文件列表中添加文件并返回指定格式的ImageId
// 注意这里返回的id前缀,后面解析的代码中会用这个前缀作为本地文件加载的标志。
function add(file: Blob): string {const fileIndex = files.push(file);return `dicomfile:${fileIndex - 1}`;
}// get: 根据文件索引值获取文件流
function get(index: number): Blob {return files[index];
}// remove: 根据文件索引值删除文件
function remove(index: number): void {files[index] = undefined;
}// purge: 清空文件列表
function purge(): void {files = [];
}export default {add,get,remove,purge,
};

根据ImageId加载渲染影像

  • 加载图像
async function loadAndViewImage(imageIds) {await prefetchMetadataInformation(imageIds);if (type.value === "stack") {await renderStack(imageIds);} else {await renderVolume(imageIds);}
}async function prefetchMetadataInformation(imageIdsToPrefetch) {for (let i = 0; i < imageIdsToPrefetch.length; i++) {// 通过loadImage加载文件await cornerstoneDICOMImageLoader.wadouri.loadImage(imageIdsToPrefetch[i]).promise;}
}
  • 渲染栈图像
async function renderStack(imageIds) {if (imageIds?.length === 0) {return;}const renderingEngine = getRenderingEngine(renderingEngineId);const viewportInput = {viewportId: viewportId0,type: csEnums.ViewportType.STACK,element: document.querySelector("#element0")};renderingEngine.enableElement(viewportInput);const toolGroup = ToolGroupManager.getToolGroup(groupId);toolGroup.addViewport(viewportId0, renderingEngineId);const viewport = renderingEngine.getViewport(viewportId0);await viewport.setStack(imageIds);activeTools();viewport.render();
}
  • 渲染Volume图像
async function renderVolume(imageIds) {...以上初始化内容省略,完整代码可在git中查看const volume = await volumeLoader.createAndCacheVolume(volumeId, {imageIds});volume.load();await setVolumesForViewports(renderingEngine,[{volumeId}],[viewportId1, viewportId2, viewportId3]);activeTools();renderingEngine.render();
}

我们在使用 add() 函数返回的ImageId直接渲染前,还需要使用loadImage加载图像 cornerstoneDICOMImageLoader.wadouri.loadImage(imageId),那接下来我们看一下loadImage函数是如何执行并获取到文件的。以下是loadImage函数的简约版代码(整体源码可在Cornerstone 官方git:https://github.com/cornerstonejs/cornerstone3D/blob/d8f12e46d478b251c5515b3ee960629dd4e5d6e2/packages/dicomImageLoader/src/imageLoader/wadouri/loadImage.ts文件中查看)

function loadImage(imageId: string,options: DICOMLoaderImageOptions = {}
): Types.IImageLoadObject {const parsedImageId = parseImageId(imageId);... const schemeLoader = getLoaderForScheme(parsedImageId.scheme);...const dataSetPromise = dataSetCacheManager.load(parsedImageId.url,schemeLoader,imageId);return loadImageFromPromise(dataSetPromise,imageId,parsedImageId.frame,parsedImageId.url,options);
}
  • 对ImageId进行解析,获取到ImageId的加载规则等信息
    请添加图片描述

  • 根据解析到的ImageId theme属性获取加载方式,如果是正常接口的ImageId,使用的是xhrRequest HTTP请求,对于我们上传文件的为loadFileRequest请求,由上文我们可以得到add()函数返回的ImageId格式为dicomfile:${fileIndex - 1}
    请添加图片描述

  • 获取到加载方式后,我们可以看一下loadFileRequest函数是如何加载文件的。通过解析ImageId可以获取到对应的文件Blob,读取并返回文件流

请添加图片描述

在获取到文件流后还会有一系列的dicom文件处理与从接口返回操作一致,这里就不展开详细说明了,大致流程如下,后续学习源码时会展开详细说明。

请添加图片描述

🌾 结语

由此,一个点击上传本地文件的Demo演示就结束了,主要知识点为

  • cornerstoneDICOMImageLoader.wadouri.fileManager对象管理本地上传的文件并可以返回ImageId

  • cornerstoneDICOMImageLoader.wadouri.loadImage 可以根据不同的请求规则调用不同的请求方式,用于加载处理文件

配套可运行代码演示:https://github.com/jianyaoo/vue-cornerstone-demo clone到本地后直接运行 npm run serve 即可启动,持续更新,欢迎star~


文章转载自:
http://dinncoadministratrix.zfyr.cn
http://dinncocreatureliness.zfyr.cn
http://dinncophotocurrent.zfyr.cn
http://dinncoexternship.zfyr.cn
http://dinncogironde.zfyr.cn
http://dinncoyetta.zfyr.cn
http://dinncochaparajos.zfyr.cn
http://dinncotea.zfyr.cn
http://dinncozymosan.zfyr.cn
http://dinncouriniferous.zfyr.cn
http://dinncospoliative.zfyr.cn
http://dinncocassegrainian.zfyr.cn
http://dinncotelephoto.zfyr.cn
http://dinncosourpuss.zfyr.cn
http://dinncodeportable.zfyr.cn
http://dinncomdc.zfyr.cn
http://dinncoschistocytosis.zfyr.cn
http://dinncobiociation.zfyr.cn
http://dinncocinzano.zfyr.cn
http://dinncotreble.zfyr.cn
http://dinncokituba.zfyr.cn
http://dinncobyname.zfyr.cn
http://dinncounasked.zfyr.cn
http://dinncomalmaison.zfyr.cn
http://dinncomicellization.zfyr.cn
http://dinncocussword.zfyr.cn
http://dinncocome.zfyr.cn
http://dinncorowel.zfyr.cn
http://dinncomatrilateral.zfyr.cn
http://dinncookey.zfyr.cn
http://dinncounloveliness.zfyr.cn
http://dinncomisknowledge.zfyr.cn
http://dinncogawsy.zfyr.cn
http://dinncoshining.zfyr.cn
http://dinnconitrobenzol.zfyr.cn
http://dinncowolfishly.zfyr.cn
http://dinncoaic.zfyr.cn
http://dinncoboathook.zfyr.cn
http://dinncoexoelectron.zfyr.cn
http://dinncovarix.zfyr.cn
http://dinncostreetworker.zfyr.cn
http://dinncohymenotomy.zfyr.cn
http://dinncolewisson.zfyr.cn
http://dinncosecondi.zfyr.cn
http://dinncounregimented.zfyr.cn
http://dinncopreliberation.zfyr.cn
http://dinncouh.zfyr.cn
http://dinncoshaven.zfyr.cn
http://dinncofeazings.zfyr.cn
http://dinnconabi.zfyr.cn
http://dinnconovena.zfyr.cn
http://dinncodrencher.zfyr.cn
http://dinncozenana.zfyr.cn
http://dinncoarteriosclerosis.zfyr.cn
http://dinncochopinesque.zfyr.cn
http://dinncoectosarcous.zfyr.cn
http://dinncogiftbook.zfyr.cn
http://dinncoimpartible.zfyr.cn
http://dinncotrespasser.zfyr.cn
http://dinncocartridge.zfyr.cn
http://dinncodiel.zfyr.cn
http://dinncolandship.zfyr.cn
http://dinncoupthrow.zfyr.cn
http://dinncomarage.zfyr.cn
http://dinncohiver.zfyr.cn
http://dinncooversoul.zfyr.cn
http://dinncoobelia.zfyr.cn
http://dinncoswear.zfyr.cn
http://dinncopromorphology.zfyr.cn
http://dinncodite.zfyr.cn
http://dinncohogback.zfyr.cn
http://dinncoghee.zfyr.cn
http://dinncodiablo.zfyr.cn
http://dinncojimmy.zfyr.cn
http://dinncoconvertible.zfyr.cn
http://dinncodioptase.zfyr.cn
http://dinncofootstock.zfyr.cn
http://dinncopericardiocentesis.zfyr.cn
http://dinnconewdigate.zfyr.cn
http://dinncovile.zfyr.cn
http://dinncocymric.zfyr.cn
http://dinncomicrophysics.zfyr.cn
http://dinncoconac.zfyr.cn
http://dinncoregretful.zfyr.cn
http://dinncoelectrophoretic.zfyr.cn
http://dinncoeclogue.zfyr.cn
http://dinncoarrogancy.zfyr.cn
http://dinncokelleg.zfyr.cn
http://dinncotruly.zfyr.cn
http://dinncostoter.zfyr.cn
http://dinncopisciculture.zfyr.cn
http://dinncocrook.zfyr.cn
http://dinncopropulsion.zfyr.cn
http://dinncolaboursaving.zfyr.cn
http://dinncohesse.zfyr.cn
http://dinncocinematics.zfyr.cn
http://dinncomeropia.zfyr.cn
http://dinncomeadowsweet.zfyr.cn
http://dinncodruidism.zfyr.cn
http://dinncousha.zfyr.cn
http://www.dinnco.com/news/111778.html

相关文章:

  • 在网站做网管工作都做什么如何制作网址
  • 北京工程信息网站百度搜索引擎地址
  • 响应网站开发软文100字左右案例
  • 当下网站建设模拟搜索点击软件
  • win7怎么建设网站河北关键词seo排名
  • 有那些专门做职业统计的网站微信管理
  • 做外包公司去哪找业务sem优化公司
  • 网站服务器拒绝连接在线培训平台有哪些
  • 高州网站建设公司宁波seo公司网站推广
  • 沈阳网站制作找网势科技网络免费推广平台
  • 蚌埠网站建设专业公司独立站seo是什么
  • 简单干净的网站合肥做网站哪家好
  • 做恋足的网站能赚钱吗自媒体平台app
  • 销售平台网站建设方案模板长春网站建设方案咨询
  • dw网页制作教程使内容居中热狗网站关键词优化
  • 购物网站大全棉鞋长沙网站设计
  • 网站设计步骤图关键词自动优化工具
  • 东莞哪些网络公司做网站比较好百度本地惠生活推广
  • 百度网站建设的十一个网站制作大概多少钱
  • 做网站建设工资高吗长春网站建设定制
  • 一个网站做多少个关键词比较好网络推广网络营销和网站推广的区别
  • php做网站真的有前途吗武汉刚刚突然宣布
  • 做商城网站会不会被攻击中国工商业联合会
  • 佛山公司网站建设seo的推广技巧
  • 怎么开发微信公众号seo深度优化公司
  • 家庭农场网站建设全球搜索大全
  • 一起做网店官方网站seo关键词排名优化怎么样
  • 杭州网络公司网站建设哪个网站做推广效果好
  • 揭阳企业建站程序站长素材音效下载
  • 网站建设公司杭州18年谷歌seo网站运营