图像处理软件包括但不限于:
图片浏览器,2D地图浏览器、图片编辑器等软件。
为了处理大分辨率图片,一般采用GDAL加载图像,GDAL可以动态加载图像的一部分,可以建立图像金字塔,优化加载速度。
一般的图像处理软件都需要对加载的图像进行放大、缩小、平移操作。首先明确:
- 放大是指图像细节增加,可见范围减少的一种浏览方式。英文名:Zoom In。
- 缩小是指图像细节减少,可见范围增加的一种浏览方式。英文名:Zoom Out。
实现
下面介绍如何实现。
编写代码前,需要建立图像浏览所使用的数学模型。如下图所示:
其中,显示窗口是指用于绘制当前浏览内容的窗口,观察区域是指,当前显示窗口中的内容对应于原图中内容的范围。二者之间必须满足:显示窗口的长宽比和观察区域的长宽比相同,单位为像素。
利用上述模型,就可以编写对应的代码了:
- 图像加载显示:使用GDAL在原图中以观察区域矩形为范围参数,读取原图中对应的像素数据,输出大小为显示窗口的大小;
- 放大浏览:显示窗口大小不变,缩小观察区域。观察区域缩小的中心点可以根据需求来设置;
- 缩小浏览:显示窗口大小不变,放大观察区域。观察区域放大的中心点可以根据需求来设置;
- 平移浏览:显示窗口大小不变,观察区域大小不变,但是根据鼠标拖动的偏移量修改观察区域的位置。
同样可以方便的计算出所谓的缩放比例了,即
缩放比例 = 显示窗口的宽 / 观察区域的宽 = 显示窗口的长 / 观察区域的长
长度单位:像素
Zoom In、Zoom Out的解释
我们知道Z轴是垂直于电脑屏幕的,指向屏幕面前的人的方向为外,指向屏幕内部的方向为内。
所以,Zoom In是指人靠近屏幕去看屏幕上的内容,显然是一种细节增加、范围减少的放大操作。
Zoom Out是指人远离屏幕去看屏幕上的内容,这是一种细节减少。范围增加的缩小操作。
结语
除了文中介绍了实现方案外,还有其他方案。比如将观察区域始终设置为和图像相同大小,固定不变,通过改变显示窗口,正确地说应该是改变绘制缓存的大小来实现放大缩小。但是可以推断,对于加载大图来说,如果在这种情况下缩小图片,或占用内存过大,或申请不到内存,速度上也会变慢。
使用文中介绍的方案,如何实现图像旋转的需求呢?这个就留给读者思考自己思考了。
最近创建了一个公众号,主要是Qt相关。如果您觉得文章有用,可以关注一下。