學習OpenSeadragon之三 (覆蓋層Overlayer的使用)


Overlayer(覆蓋層)是一個很重要的機制,它可以在可縮放圖片上顯示額外的信息。

1.簡單應用

以下是我做出的一個小例子:

看這小老鼠頭部的紅色框內的部分就是一個分離出來的overlay。

介紹一下overlays:這是一個對象數組,定義了顯示框viewer中固定的overlays層。overlays層通過這個選項來添加,之后這個塊就從OpenSeadragon中去除了。

既然是數組,當然我們就可以定義很多個overlay。

下面結合這個Demo的核心代碼來講解:

 1 var openSeadragon = new OpenSeadragon({
 2       ...
 3         //定義覆蓋層overlays
 4         overlays: [{  
 5                 id : "overlays-div",   //設置overlay的id
 6                 x:0.6,                 //起始位置x
 7                 y:0.16,                //起始位置y
 8                 width:0.1,             //設置寬度
 9                 height:0.08,           //設置高度
10                 className:"highlight", //設置overlay的類名
11                 }],
12     },
13     ...
14 });

這是在之前Demo的基礎上添加的代碼,“...”表示省略的代碼,OpenSeadragon的簡單配置和怎么顯示在HTML中請參考:學習OpenSeadragon之一(一個顯示多層圖片的開源JS庫)

overlays:[{...}]會生成一個新的 overlays對象,id和className分別是這個對象的id名和類名,我們可以通過這兩個參數來找到訪問它並且設置其樣式。

x、y是overlays的左上角起點位置,這是相對於整個圖片大小比例來說的,比例x=0 y=0就是整幅圖片左上角。

不過經過我測試(開啟調試模式比較),y的值是相對於寬度的比例來說的,例如整幅圖的 寬=100 高=50, x=0.1 y=0.1,那么起點位置為(100*0.1,100*0.1)=(10,10),跟整幅圖高度沒有關系。

width和height分別是overlays的寬度和高度,也是相對於整幅圖像寬的比例。

 

如果僅僅做以上修改,我們發現圖像沒有任何改變,這是因為我們僅僅得到了overlays對象卻沒有修改其樣式。

因為修改overlays對象樣式必須在head的style里修改(官方是這么說的),以下是這個例子的完整代碼:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>OpenSeadragon_Demo1</title>
 6     <script src="openseadragon.min.js"></script>
 7 </head>
 8 <style>
 9     #overlays-div{
10         border: 1px solid red;
11     }
12 </style>
13 <body>
14     <h1>overlays</h1>
15     <div id="openSeadragon1" style="width:800px; height:350px; border:1px solid blue;"></div>
16 </body>    
17 <script type="text/javascript">
18 var openSeadragon = new OpenSeadragon({
19     id:  "openSeadragon1",  //指定顯示的div
20     prefixUrl: "./images/", //庫中按鈕等圖片所在文件夾
21     tileSources: {     
22         Image: {
23             xmlns:  "http://schemas.microsoft.com/deepzoom/2009",//指令集
24             Url: "./ccc_files/", //圖片庫地址
25             Overlap: "1",        //相鄰圖片重合的像素
26             TileSize: "256",     //單個切片(正方形)的邊長
27             Format : "jpg",         //切片格式
28              //圖片總大小
29             Size:{
30                 Height: "1181",
31                 Width:  "2953",
32             },
33         },
34         //定義覆蓋層overlays
35         overlays: [{  
36                 id : "overlays-div",    //設置overlay的id
37                 x:0.6,                   //起始位置x
38                 y:0.16,                    //起始位置y
39                 width:0.1,              //設置寬度
40                 height:0.08,            //設置高度
41                 className:"highlight",  //設置overlay的類名
42                 }],
43     },
44     //debugMode : true, //開啟調試模式
45 });
46 </script>
47 </html>

 

2.像素設置 overlays的位置和長寬

可以用像素值設置overlays的位置和長寬,只要將x,y換成px,py即可:

1 overlays: [{  
2           id : "overlays-div",    //設置overlay的id
3           px:950,                   //起始位置x
4           py:220,                    //起始位置y
5           width:500,              //設置寬度
6           height:450,            //設置高度
7           className:"highlight",  //設置overlay的類名
8         }],

效果:

之所以設置了寬500 高450的像素看上去卻沒那么大,是因為這是按照圖片放大到最大分辨率時候的像素,它會隨圖片縮小而縮小,以確保比例是一定的。

 

3.將overlays定義在已經定義的div中

上面的例子是定義一個id沒有被創建的overlays,這樣會自動創建一個新的overlays,例如上圖的紅框。

我們也可以指定一個已經被定義的div為overlays,這樣做的好處是,我們可以往overlays里面添加文字、圖片等所有HTML里的內容,然后再將其放入整個圖片框viewer中。

核心代碼:

 1 <body>
 2     <h1>overlays</h1>
 3     <div id="openSeadragon1" style="width:800px; height:350px; border:1px solid blue;"></div>
 4     <div id="overlays-div" class="overlays" >
 5         隨便百度一張圖片作為overlays
 6         <img src="http://e.hiphotos.baidu.com/image/pic/item/21a4462309f790528c5b54390ff3d7ca7bcbd574.jpg" 
 7         alt="">
 8     </div>
 9 </body>    
10 <script>
11 var openSeadragon = new OpenSeadragon({
12     ...
13     overlays: [{  
14             id : "overlays-div",    //設置overlay的id
15             px:2300,                //起始位置x
16             py:0,                   //起始位置y
17             width:800,              //設置寬度
18             height:1181,            //設置高度
19             className:"overlays",   //設置overlay的類名
20             }],
21     },
22     ...
23 });
24 </script>

 

4.使用addOverlay函數和removeOverlay函數實現overlay的創建與銷毀

OpenSeadragon給我們提供了內置函數對overlay進行操作。

以下用一個外部按鈕按下,就顯示overlay,再次按下就銷毀overlay的例子來說明:

按下“顯示overlays”前:

按下“顯示overlays”后:

再次按下“銷毀overlays后”圖片消失。

核心代碼就是對addOverlay和removeOverlay的調用,以下是這個demo的完整代碼:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>按鈕操作overlays的創建與銷毀</title>
 6     <script src="openseadragon.min.js"></script>
 7 </head>
 8 <body>
 9     <h1>按鈕操作overlays的創建與銷毀</h1>
10     <button id="button">顯示overlays</button>
11     <div id="openSeadragon1" style="width:800px; height:350px; border:1px solid blue;"></div>
12 </body>    
13 <script type="text/javascript">
14 var openSeadragon = new OpenSeadragon({
15     id:  "openSeadragon1",  //指定顯示的div
16     prefixUrl: "./images/", //庫中按鈕等圖片所在文件夾
17     tileSources: {     
18         Image: {
19             xmlns:  "http://schemas.microsoft.com/deepzoom/2009",//指令集
20             Url: "./ccc_files/", //圖片庫地址
21             Overlap: "1",        //相鄰圖片重合的像素
22             TileSize: "256",     //單個切片(正方形)的邊長
23             Format : "jpg",         //切片格式
24              //圖片總大小
25             Size:{
26                 Height: "1181",
27                 Width:  "2953",
28             },
29         },
30     },
31 });
32 
33 var overlay = false;                                   //overlay標記位,存在為true,不存在為false
34 var btn = document.getElementById('button');           //獲取按鈕DOM對象
35 btn.onclick =                                          //按下按鈕,執行創建或者銷毀overlays
36 function() {
37     if (overlay) {
38         openSeadragon.removeOverlay("overlays-div");   //根據id,銷毀移除overlay
39         //改變按鈕提示狀態
40         btn.innerHTML = "顯示overlays";
41     } else {
42         var elt = document.createElement("div");       //創建一個div對象作為overlays
43         elt.id = "overlays-div";                       //設置div對象的id
44         //執行添加overlay的函數
45         openSeadragon.addOverlay({
46             element: elt,                              //overlay的元素名稱(上面創建的div)
47             location: new OpenSeadragon.Rect(0.75, 0.1, 0.2, 0.2), //設置overlay在view上的位置
48         });
49         //為overlays添加圖片
50         elt.innerHTML = "<img src='http://e.hiphotos.baidu.com/image/pic/item/21a4462309f790528c5b54390ff3d7ca7bcbd574.jpg'>";
51         //改變按鈕提示狀態
52         btn.innerHTML = "銷毀overlays";
53     }
54     overlay = !overlay;                                 //標記位取反
55 };
56 </script>
57 </html>

官方demo參考:

http://openseadragon.github.io/examples/ui-overlays/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM