动态生成深度缩放图像的实现

深度缩放技术是用于显示大型图像的一种技术。例如,Google地图就是一个典型的例子,它将图像分割成一系列的缩放级别,比如从1到13。在这些深度缩放级别中,整个图像可以非常大,例如4000 x 3000像素。由于图像视图窗口通常只有800 x 600像素,因此没有必要将整个图像加载到内存中,尤其是在Web应用程序中。因此,大图像被切割成更小的瓦片,例如每个256 x 256像素。深度缩放应用程序只加载构成显示区域的那些瓦片。这种方式将使缩放和拖动更快、更有效。

在ASP.NET应用程序中,大多数深度缩放应用程序使用Silverlight MultiScaleImage组件。有许多文章展示了如何使用它。最近,发现Seadragon深度缩放组件使用AJAX实现,这样客户端甚至不需要下载Silverlight运行时即可工作。Seadragon的典型用法如下: var viewer = null; function init() { viewer = new Seadragon.Viewer("container"); viewer.openDzi("carina-nebula.dzi"); } Seadragon.Utils.addEvent(window, "load", init); 这段代码中,viewer.openDzi("carina-nebula.dzi");需要在Web应用程序的根路径下打开一个文件“carina-nebula.dzi”。该文件指示Seadragon查看器加载文件夹中的瓦片图像,该文件夹包含数百或数千个不同缩放级别的瓦片图像。这些瓦片图像必须通过Microsoft的Deepzoom Composer等工具准备和生成。如果想切换到许多不同的图像,必须为每个图像准备多套这些瓦片图像。这是一项繁琐的工作。幸运的是,Seadragon组件支持动态瓦片源。它可以设置为向Web服务器发送请求,请求瓦片图像。以下代码显示了如何做到这一点: var tileSource = new Seadragon.TileSource(width, height, tileSize, tileOverlap); tileSource.getTileUrl = function(level, x, y) { return "GetTileImage.ashx?level=" + level + "&x=" + x + "&y=" + y + "&tileSize=" + tileSize + "&tileOverlap=" + tileOverlap + "&photo=" + imageUrl; };

首先,它创建了一个tileSource对象。参数“width”和“height”分别指示图像的宽度和高度。“tileSize”指示瓦片图像的大小,通常为256。“tileOverlap”指示相邻瓦片图像之间的重叠像素数。然后它定义了tileSource的方法getTileUrl。当Seadragon深度缩放组件需要瓦片图像时,它会调用该方法从Web服务器获取图像URL,参数“level”,“x”和“y”分别指示缩放级别、瓦片的列号和行号。在演示Web应用程序中,制作了ASP.NET Web处理程序GetTileImage.ashx,为Seadragon深度缩放组件准备瓦片图像。因此,所有的瓦片图像都是即时创建的。这里是演示页面:http://zi01.org/Seadragon/。test.jpg是一个非常大图像,文件大小为17MB。但可以看到这里的缩放和拖动非常快,因为它只加载图像的一部分。在演示页面上,如果想在Deepzoom控件中显示它,可以指定一个互联网上的图像URL。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485