1:做过图像显示的都知道,我们的图片大部分都是压缩过的,大部分为JPEG PNG BMP其中BMP格式是点阵形式,当图片翻译到内存之后无论压没压缩过都会变成BMP格式放进内存,在这个过程中,图片数据会几倍的增大,就比如JPEG,一张1M大小的JPEG格式的图片,翻译到内存可能就会变成7倍左右,也就是7M会放在电脑内存里面,如果显示一张100M的JPEG图片,放进内存的话可能就会成为1G,好了如果是1G的图片呢,你的电脑内存还够用吗,可以,兄弟你可以说我电脑配置很高 达到16G内存条,,如果我要让你显示一张4G的图片呢,注意压缩过的,翻译到内存将近28G,你说我可以买一个28G的内存条,可以 ,兄弟你很有钱,哈哈哈,,如果你非要这样,这篇文章可以不用看了,跪拜土豪。那如果,我就想用一个2G的内存条显示这张压缩过还有4G的图片咋办,并且我还想生成这张图片呢,就比如说,我用显微镜拍一张切片,或则一个材料的纹理结构,那么虽然或许一个切片只有几个CM,但是显微镜人家分辨率高呀,看的细呀,用显微镜不就是想把图片放大个几千倍显示嘛,好了,问题来了,这样显微照相机可能要拍上千张图片,最后拼接成一张大图,然后放在电脑上显示,所有医生可以在电脑面前指指点点,是不是很方便,但是,同志,问题又来了,电脑内存不够,你也生成不了这么大的图片,生成的过程也是在电脑内存里面的, 好了,废话不多说了,看下面的演示吧。
1:准备一张54889x80315图片,当然不一定很多人会有这么大的图片,因为不知道这种技术的话,也没法生成这么大的图片。
如图:
这张图片大小是54889x80315 这数据量大概有多大呢,我算了一下,大概是4.2041G,细心的网友可能会注意到,为什么显示的大小只有399M 呢,,哈哈哈,,这就是另一个技术了,想听的朋友们,会在后续的文章中,解密。
2:现在假设我们大家都有了这张图片了,下面我们想显示这张图片:首先,都会想到的,我用常规的浏览器试一下呗,我们就先用微软自带的图片浏览器,不要小瞧了这个windows图片查看器,亲测,他很智能,也很高效,千万不要以为他是个小程序,有时候我确实可以打开我的图片,即使我的图片有着我设计的特殊的数据结构和压缩形式,PS都不能打开我的图片,这家伙可以打开,所以在这里我还是很佩服这个图片浏览器。
怎么样,哈哈哈,电脑内存不够吧,当然这个浏览器再吊,也只是傻大粗的野蛮式显示这张图片,当然内存不够用了。我在我朋友8G内存的电脑上也试了,一样死机!!!显示都显示不了了,还谈什么产生这张图片。
3:但是呢,我用自己写的软件,就可以打开这张图片,当然之前我也知道怎么产生这张图片,这是一个完整的流程;我的软件打开的效果是:
来一张全局的图像效果:如下:
其实把图片使劲缩小显示,图片的全局效果就长成这样。其实效果和你显示一张小图片没什么区别,流畅度,还有你可以做标记,什么的,,,,这些都是很多别的浏览器都具备的附加功能,但是当这些附加功能实现过程也是很痛苦的,为什么呢,就是因为这是一张超大图片,太大了,显示机制不一样,所以一切传统方法都得颠覆一下。
写的好累,这个项目,做了两年,就是为了完成这个软件,整个过程也比较痛苦,因为我是机械出身,现在还在学校读研究生,写代码的水平赶不上科班出身,这项技术整个完整流程,我打算慢慢写下来,从你如何产生一张目前为止最大的图片,让你图像拼接突破计算机限制,让你如何显示出来,如何平移,如何缩放,如何做标记等等,,太多了内容,,完整工程文件,包括编译好的库文件,我都有,压缩包解压就可以直接用,我用WPF编写的,其实WPF就和C#差不多,其实他两是兄弟。代码数量超过好几万。可是花费了我好大的心血。有兴趣的朋友可以百度一下Aperio,MOTIC这些企业,Aperio这个软件是和他的仪器配套出售的,据说一台仪器好几百万,功能就是显微镜扫描一个切片,然后打开浏览切片,主要是方便医生进行切片检查,同时减轻医生的工作量,要知道,没有这个仪器的话,医生可要用眼睛一个个看切片,成千上万的切片这是要累死医生呀!!!眼睛瞅瞎!!!Aperio他们做的扫描一张切片就几秒,然后就输入到电脑,用软件显示出来,这个软件核心功能,也就是我这个软件的功能。。。。。。。
整个软件涉及到的技术有,TIFF图像技术,四叉树,虚拟显示技术,虚拟容器技术,内存映射文件技术,图像金字塔技术等等剩下的就是什么,做标记,XML文档管理,缩略图显示,UI布局等等 真的很多。
有兴趣的朋友可以关注后续的文章,有需要这个软件的可以联系我,我的邮箱nanshanyi@sjtu.edu.cn,可以商量。今天就写到这。。。。。。