前端框架:

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. [FE] Quasar BEX 所有位置类型 types

    科普:[FE] Quasar BEX 预览版指南 New Tab Quasar BEX 的默认类型是 New Tab,在新 tab 栏里打开内容. Dev Tools 也就是在开发者栏里面的内容. O ...

  2. WPF 列表控件数据源绑定多个数据集合方法

    在 WPF 用的多的列表控件如 ListBox 或 ListView 等,本文告诉大家在这些列表控件上进行绑定多个数据集合来源的多个实现方法.如有一个显示动物列表的控件,需要绑定的数据来源是阿猫和阿狗 ...

  3. 举例useContext性能低下的样例,同时推荐用什么方法改进

    在React中,useContext 是一种非常方便的全局状态管理工具,它可以让我们在组件之间共享状态,而不需要通过层层传递 props.然而,当我们在一个大型的 React 应用中过度使用 useC ...

  4. XPRA: SAP传输后自动运行程序

    今天了解到一个功能,允许TR导入后自动运行指定程序.比如使用VOFM创建新的例程后,需要运行RV80HGEN来重新生成程序.可以在TR中包含以下对象,则TR导入完成后,会自动运行RV80HGEN. P ...

  5. Java 集合类 List 的那些坑

    现在的一些高级编程语言都会提供各种开箱即用的数据结构的实现,像 Java 编程语言的集合框架中就提供了各种实现,集合类包含 Map 和 Collection 两个大类,其中 Collection 下面 ...

  6. 深入理解Django:中间件与信号处理的艺术

    title: 深入理解Django:中间件与信号处理的艺术 date: 2024/5/9 18:41:21 updated: 2024/5/9 18:41:21 categories: 后端开发 ta ...

  7. Centos 密码过期问题 password has expired

    1.这个主要是由/etc/login.defs参数文件中的一些参数控制的的.它主要用于用户账号限制PASS_MAX_DAYS 60     #密码最大有效期,此处参数PASS_MAX_DAYS为60, ...

  8. vue3中404路由匹配规则

    { path: '/:pathMatch(.)', component: () => import('@/views/error/404.vue') },

  9. vue中render函数和h函数

    "render"函数是Vue组件的一个重要方法,它用于描述组件的视图结构,并负责渲染虚拟DOM树."render"函数是一个JavaScript函数,它接受一个 ...

  10. 数据库实验—DDL

    使用SQL语句,在D盘的Data文件夹下,创建一个名为jxdb+学号后2位的教学管理数据库(如:学号后两位为01,则数据库名为jxdb01).把教学管理数据库文件增长参数设置为4MB,文件最大大小参数 ...