openseadragon实战系列第三方插件(有你想要的干货)
序言
在我们的项目中,一般不可能只是简单的显示图片,对应着还需要做一些图像标注、图像颜色过滤等操作,比如一些医学病理切片。所以openseadragon也为我们提供了一些插件,我们打开官网,找到plugins
这些插件中有很多是中间件,各位根据自己的需求自行研究把,在我的项目中只使用到了OpenseadragonFiltering颜色过滤插件
OpenseadragonFiltering中间件
在filtering的github中介绍了很多过滤颜色的插件,但是在我实际应用中,只有卷积(锐度)是好用的,所以我还引用了第三方的插件,稍候介绍,此处只介绍Filtering的卷积(锐度)如何使用。
根据github使用说明,将openseadragon与filtering结合可以这样使用
viewer.setFilterOptions({
filters: {
processors: []
}
})
所以卷积应该放在processors里,即
viewer.setFilterOptions({
filters: {
processors: [
OpenSeadragon.Filters.CONVOLUTION(arr)
]
}
})
关于卷积矩阵的定义,建议大家百度一下。在这里大概说一下,卷积矩阵需要保证矩阵内所有数字相加得1,而且,矩阵必须为奇数,即3*3、5*5、7*7矩阵,具体使用哪种矩阵,根据你项目的需求而定。一般矩阵越大,卷积精度越高。在这里我是用的是最简单的3*3矩阵,直接上我的代码
viewer.setFilterOptions({
filters: {
processors: [
that.getConvolution()
]
}
})
getConvolution:function(){
//矩阵规则,所有数相加得1;一般矩阵为3*3、5*5、7*7,只要保证为奇数即可,此处用最简单的3*3。
var num = parseInt(convolution.config.nowValue);//获取当前用户输入的卷积数值
var arr = [0,-num,0,-num,num*4+1,-num,0,-num,0]/不一定按照这种矩阵来,只要保证相加得1即可
return OpenSeadragon.Filters.CONVOLUTION(arr)
}
当然可能还有些童鞋不明白卷积矩阵到底是啥,简单说明一下,在插件处理图像时,是按照像素来进行处理得,从(0,0)这个像素点一直处理到你图像的右下角,每处理一点,都会使用这个卷积矩阵。当前点即为矩阵中心点,用第一个点(0,0)举例,这点就对应着上边代码的(num*4+1)这个点,然后按照一定的规则结合你的矩阵,将这个点的四周像素点进行处理。如果你不是一个专业做图像,就不用管具体是怎么实现的,你只需要知道矩阵的一般规则即可,感兴趣还是建议去百度一下更为专业的解释。
接下来我使用另一个插件来处理伽马、对比度、饱和度和三通道颜色。
caman.js
如果各位看了filtering的github可以找到,这个插件也提供了结合caman.js使用的方法,使用方法如下
viewer.setFilterOptions({
filters: {
processors: [
function(context, callback) {
Caman(context.canvas, function() {
//这里放需要加入的图像处理
this.render(callback);
});
}
]
}
})
关于caman.js的使用,各位在官网可以找到,使用方法非常简单,这里就不再赘述了,关于filtering和caman两种不同的颜色过滤结合使用在filtering的github里也有介绍,我就直接贴上我项目中的完整过滤代码
updateFilter:function(){
Caman.Store.put = function() {};
viewer.setFilterOptions({
filters: {
processors: [
//卷积(锐度)
that.getConvolution(),
function(context, callback) {
Caman(context.canvas, function() {
//伽马
this.gamma(用户输入的数值);
//对比度
this.contrast(用户输入的数值);
//饱和度
this.saturation(用户输入的数值);
//三通道颜色
this.channels({
red: 用户输入的数值,
green:用户输入的数值,
blue:用户输入的数值
});
//必须render
this.render(callback);
});
}
]
}
})
},
getConvolution:function(){
//矩阵规则,所有数相加得1;一般矩阵为3*3、5*5、7*7,只要保证为奇数即可,此处用最简单的3*3。
var num = 用户输入的数值;
var arr = [0,-num,0,-num,num*4+1,-num,0,-num,0]
return OpenSeadragon.Filters.CONVOLUTION(arr)
}
这里注意一点,所有的过滤必须给定一个默认的数值,因为中间件filtering的processors,如果你每次只设置一种过滤,那么之前设置的过滤将被清空,只绘制这一次的过滤,所以在我的项目中,图像被openseadragon打开后,我就调用了updateFilter这个方法,然后每次用户输入都将会调用updateFilter这个方法。
至此,颜色过滤就完成了。
结束
openseadragon这个系列也是自己摸索了很长时间才完成到这个程度。实际项目中可能大家还会遇到画线、标注和测量的问题,因为各种js间点击事件的冲突,所以画线标注我一直没找到一个很好的解决方案,所以也就不放上来了。如果你也正在处理openseadragon 的项目,大家可以一起相互讨论,如果以后我找到了好的解决方案,我会再次更新这个系列。