前端框架:

vue+elementui+openseadragon

后端

.net core 5.0

数据库

mysql

目前项目效果如图

在原有的基础上新增了阅片轨迹

图像调节,绘图,截图等功能.

另外锐化这块,目前是修改了OpenSeadragon的插件源码.不然锐化会有明显的边界分割线.

锐化会严重影响性能,目前没有什么太好的解决方法

截图功能模块:

截取当前视野,并存到后台api端

web端报告打印

基于vue-print-nb控件,实现了组件打印的控制

基于html2canvas,实现了打印的时候生成webp格式的报告截图,用于病理中心的报告存档.

通过数据库设计,实现了报告的动态电子签名、动态单/双抬头(文字or图片)的设计.

总体来说,Openseadragon是一款非常强大的tiff多层图片web端插件.

类似的还有openlayer.接触不多.资料相对来说更少.

目前主流的医疗细胞阅片,基本都是采用的openseadragon.

openseadragon初始化

<template>
<div class="app-container" style="height: calc(100vh - 86px); padding: 0px;" v-loading="loading">
<el-row :gutter="20" style="height: calc(100vh - 87px); padding: 0px" type="flex">
<div style="position: relative;float: left;flex:1">
<div class="slider" id="myslider" style="
z-index: 999;
float: left;
margin-top: 10px;
position: absolute;"></div>
<div id="openseadragon1" style="width: 100%; height: 100%; z-index: 99;"></div>
</div>
</el-row>
</div>
</template>
<!-- 省略部分代码 -->
  InitViewer: function (fileid, w, h) {
// console.log('viewImgApp',viewImgApp.data());
this.viewer = new OpenSeadragon({
id: "openseadragon1", //绑定ID
// prefixUrl: "http://localhost:6011/Content/js/openseadragon/images/", //openseadragon自带的一些图标
showNavigator: true,
navigatorPosition: "TOP_RIGHT",
gestureSettingsMouse: { clickToZoom: false }, //设置鼠标单击不可放大
navigatorWidth: 200,
navigatorHeight: 200,
// iOSDevice: true,
// useCanvas: false,
// hardwareAcceleration: false,
// colorSpace:'srgb',
// zoomPerSecond:4,///结束单个缩放动画的秒数
// gestureSettingsMouse: {
// flickEnabled:false, // 拖动手势结束时禁用动态平移效果(轻弹)
// flickMinSpeed: 1, // 拖动结束动态平移效果的时间
// flickMomentum:1, // 拖动结束动态平移效果的距离
// },
// springStiffness:999, //缩放过渡效果,,值越小,则动画越趋于柔和
animationTime: 1, //放大或缩小动画过渡的时间,这个值越小,过渡快
animationZoomTime: 1,
navigatorSizeRatio: 0.2, //导航的大小与整体视图的比例 , 如果设置了导航的宽高 则忽略此属性
navigatorMaintainSizeRatio: true, // 当容器大小改变时,是否自动缩放导航图的大小,此属性依赖上一属性
navigatorAutoResize: true, // 根据视图自动调整导航大小 若已确定导航大小,请设置为false避免每次窗口缩放的查询 可提高性能
navigatorAutoFade: false, // 如果用户停止与视口交互,则淡化导航器迷你地图。设置为false将使导航器小地图始终可见。
navigatorBackground: "#ffffff", //导航背景色
navigatorOpacity: 1, //0.8, //导航背景透明度
navigatorBorderColor: "#ffffff", // 导航边框颜色
navigatorDisplayRegionColor: "#FF3385", //导航中,当前查看区域的边框颜色
zoomInButton: "btnzoomin",
zoomOutButton: "btnzoomout",
homeButton: "btnzoomhome", //恢复默认
fullPageButton: "btnzoomful",
smoothTileEdgesMinZoom: Infinity,////放大到最大倍率后,容器的表现形式,是否为平滑过渡,还是由原图逐渐放大到容器的宽度,这个属性会影响性能,建议使用Infinity将此属性关闭,且IOS下,设置此属性无效
smoothTileEdges: false,
debugMode: false,
//maxZoomPixelRatio:200,
defaultZoomLevel: 0.6,
// maxZoomLevel: 40,
// minZoomImageRatio:0.9,
// maxZoomPixelRatio: 100,//最大能够将图像放大为最大图像像素宽高的多少倍,为数字类型,默认为1.1.
crossOriginPolicy: true,
preserveOverlays: false, //切换图片后,仍然保留图层
preserveViewport: false, //切换阅片的时候,是否保留视窗
autoResize: true,
preserveImageSizeOnResize: true// 设置图像是否保留原图比例大小,以确保当容器被放大或者缩小时,图片被拉伸,当上一属性为true时起作用,
// debugMode: true,
});
this.viewer.scalebar({
type: OpenSeadragon.ScalebarType.MAP,
pixelsPerMeter: window.rqconfig.PIXELSPERMETER == null ? 6800000 : window.rqconfig.PIXELSPERMETER,//28985500,,//30000000, //设置像素与实际的比值 1米=?个像素
minWidth: "150px",
location: OpenSeadragon.ScalebarLocation.BOTTOM_LEFT,
xOffset: 15,
yOffset: 10,
stayInsideImage: false,
color: "rgb(0, 0, 0)",
fontColor: "rgb(0, 0, 0)",
backgroundColor: "rgba(255, 255, 255, 0.4)",
fontSize: "middle",
barThickness: 4,
});
// this.viewer.addHandler("open", function () {
// console.log("图像打开成功");
// debugger
// this.curZoom = this.viewer.viewport.getZoom(true);
// this.imgZoom = this.viewer.viewport.viewportToImageZoom(_this.curZoom);
// //这是下一步图像过滤的操作
// //active.updateFilter();
// });(
this.viewer.addHandler("open", () => {
console.log("图像打开成功");
this.curZoom = this.viewer.viewport.getZoom(true);
this.imgZoom = this.viewer.viewport.viewportToImageZoom(this.curZoom);
//这是下一步图像过滤的操作
//active.updateFilter();
});
 var url_img = window.vm.localConfig.VUE_APP_BASE_API + "/Images/TileImg/1/" + fileid + "/";
this.viewer.world.resetItems();
var tileSource = {
//装载tileSource
Image: {
xmlns: "http://schemas.microsoft.com/deepzoom/2009",
Url: url_img,
Overlap: "0",
TileSize: "256",
Format: "jpg",
autoResize: true,
Size: size_img,
},
};

配套的tiff图片上传工具,采用http的tus协议,实现了断点续传,token授权,自动根据token上传到指定云端服务器医院文件夹下.

使用wpf ,基于http 的tus协议开发.

基于Vue+OpenSeaDragon的数字细胞阅片开发的更多相关文章

  1. 基于Vue、web3的以太坊项目开发及交易内幕初探 错误解决总结

    基于Vue.web3的以太坊项目开发及交易内幕初探 本文通过宏观和微观两个层面窥探以太坊底层执行逻辑. 宏观层面描述创建并运行一个小型带钱包的发币APP的过程,微观层面是顺藤摸瓜从http api深入 ...

  2. 基于 vue+vue-router+vuex+axios+koa+koa-router 本地开发全栈项目

    因为毕业设计要做基于Node服务器的项目,所以我就想着用刚学的vue作为前端开发框架,vue作为Vue.js应用程序的状态管理模式+库,axios基于promise用于浏览器和node.js的http ...

  3. 使用基于Vue.js和Hbuilder的混合模式移动开发打造属于自己的移动app

    近几年,混合模式移动应用的概念甚嚣尘上,受到了一些中小型企业的青睐,究其原因,混合模式开发可以比传统移动开发节约大量的开发成本和人力成本. Hybrid App(混合模式移动应用)是指介于web-ap ...

  4. 使用webpack4搭建一个基于Vue的组件库

    组内负责的几个项目都有一些一样的公共组件,所以就着手搭建了个公共组件开发脚手架,第一次开发 library,所以是参考着 iview 的配置来搭建的.记录如何使用webpack4搭建一个library ...

  5. 基于HBuilderX+UniApp+ThorUI的手机端前端开发处理

    现在的很多程序应用,基本上都是需要多端覆盖,因此基于一个Web API的后端接口,来构建多端应用,如微信.H5.APP.WInForm.BS的Web管理端等都是常见的应用.本篇随笔概括性的介绍基于HB ...

  6. 基于Vue的数字输入框组件开发

    1.概述 Vue组件开发的API:props.events和slots 2.组件代码 github地址:https://github.com/MengFangui/VueInputNumber 效果: ...

  7. 「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之自定义组件(四)

    基于Vue和Quasar的前端SPA项目实战之序列号(四) 回顾 通过上一篇文章 基于Vue和Quasar的前端SPA项目实战之布局菜单(三)的介绍,我们已经完成了布局菜单,本文主要介绍序列号功能的实 ...

  8. 基于Verilog HDL 的数字时钟设计

    基于Verilog HDL的数字时钟设计 一.实验内容:     利用FPGA实现数字时钟设计,附带秒表功能及时间设置功能.时间设置由开关S1和S2控制,分别是增和减.开关S3是模式选择:0是正常时钟 ...

  9. 一次基于Vue.Js用户体验的优化

    .mytitle { background: #2B6695; color: white; font-family: "微软雅黑", "宋体", "黑 ...

  10. 发布自己第一个npm 组件包(基于Vue的文字跑马灯组件)

    一.前言 总结下最近工作上在移动端实现的一个跑马灯效果,最终效果如下: 印象中好像HTML标签的'marquee'的直接可以实现这个效果,不过 HTML标准中已经废弃了'marquee'标签 既然HT ...

随机推荐

  1. [FAQ] Sortable 拖拽组件, 火狐浏览器中打开新窗口问题

      Q:用了 sortable 组件,在火狐浏览器中进行拖拽时,会打开新窗口 ? Sortable组件地址,https://github.com/SortableJS/Sortable 当前处理方式 ...

  2. WPF 自己封装 Skia 差量绘制控件

    使用 Skia 能做到在多个不同的平台使用相同的一套 API 绘制出相同界面效果的图片,可以将图片绘制到应用程序的渲染显示里面.在 WPF 中最稳的方法就是通过 WriteableBitmap 作为承 ...

  3. WPF 让窗口激活作为前台最上层窗口的方法

    在 WPF 中,如果想要使用代码控制,让某个窗口作为当前用户的输入的逻辑焦点的窗口,也就是在当前用户活动的窗口的最上层窗口,默认使用 Activate 方法,通过这个方法在大部分设备都可以做到激活窗口 ...

  4. js实现打字机效果(完整实例)

    在上篇css高斯模糊的效果基础上用js实现一个打字机效果: 上图: 代码: <!DOCTYPE HTML> <html lang="en-US"> < ...

  5. Lora训练的参数和性能

    主要为了测试模型增加Lora模块后,参数量和训练速度的变化情况.结论:正常情况下,增加Lora模块是会增加参数量的,因此前向传播和反向传播的时间也会增加.但是,在大语言模型训练的情况下,因为基础模型本 ...

  6. LVS负载均衡(3)-- DR模型搭建实例

    目录 1. LVS DR模型搭建 1.1 DR模型网络规划 1.2 RS设备的VIP冲突解决方式 1.3 DR模型访问流程 1.4 DR模型配置 1.4.1 ROUTER设备配置 1.4.2 后端ng ...

  7. linux文本三剑客之grep及正则表达式详解

    linux文本三剑客之grep及正则表达式详解 目录 linux文本三剑客之grep及正则表达式详解 1. grep命令详解 2. 正则表达式 2.1 基本正则表达式 2.2 扩展正则表达式 1. g ...

  8. Oracle中ALTER TABLE的五种用法(二)

    首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...

  9. ICESat-2 ATL03光子数据读取

    ICESat-2数据处理的方式一般为将光子数据投影到沿轨距离和高程的二维空间.如下图: ATL03数据读取 H5是一种数据存储结构,读取原理就是按照该结构获取数据,这里给出两种读取方式. ATL03的 ...

  10. uniapp 配置 基座调试指定页面

    在用hbuildx时,用自定义基座,调试程序时,有的页面因为基座缺少组件而进不去,这个时候就可以用指定页面的方式,我们只需要把进入页面的入参传进去,这个时候打开页面就是指定要调试的页面了. 就在pag ...