一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

序言

  根据系列前的三篇,你已经可以正确地显示图像,后端也可以正确地组织目录结构得到图像,那么接下来就是前端与后端的结合。

  openseadragon已经自带了ajax请求,你只需要正确的使用即可。

前端请求

  再来回顾基础篇的代码

 1 <div id="openseadragon1" style="width: 800px; height: 600px;"></div>
 2 <script src="/openseadragon/openseadragon.min.js"></script>
 3 <script type="text/javascript">
 4     var viewer = OpenSeadragon({
 5         id: "openseadragon1",//绑定ID
 6         prefixUrl: "/openseadragon/images/",//openseadragon自带的一些图标
 7         tileSources: {
 8             Image: {
 9                 xmlns:  "http://schemas.microsoft.com/deepzoom/2009",
10                 Url: root + "/public/images/first/",//图片存放的路径
11                 Overlap: "0",
12                 TileSize: "1024",
13                 Format : "jpg",
14                 Size:{
15                     Height: "38912",
16                     Width:  "24704"
17                 }
18             }
19         }
20     });
21 </script>

我们可以看到tileSources里放置的是前端写死的路径和数据,现在我们需要将tileSources更换成请求ajax的方式。

 1 var viewer2 = OpenSeadragon({
 2             id: "openseadragon1",
 3             prefixUrl: root + "/public/images/icon/",
 4             tileSources:{
 5                 tileSource:root + "/api/get/ali/image",//后台接口地址
 6                 loadTilesWithAjax:true,//使用ajax请求
 7                 success:function(res){
 8                     console.log(res)//成功回调
 9                 },
10                 error:function(err){
11                     console.log(err)//失败回调
12                 }
13             }
14         });

把tileSources里的内容换成如上代码即可正确显示数据。就是这么简单。当然按照这样写后端的数据返回格式也有要求。

后端数据返回格式

  后端返回json格式数据如下图所示

  是不是很熟悉,这种格式即为静态数据时tileSources里的配置。在开篇时说过,要结合阿里存储,上图被我注释掉的是我们公司阿里文件存储的地址,因为设计到客户资料,所以不便显示。当然如果你只是一个前端的话,没有后端跟你配合研究这个,你可能会很麻烦。贴心如我,后端的代码也为你准备好了。

  我使用的是spring boot 框架

  首先定义最外层返回数据 ResData.java

 1 public class ResData {
 2     private String xmlns;
 3     private String Url;
 4     private String Overlap;
 5     private String TileSize;
 6     private String Format;
 7     private Object Size;
 8  
 9     public ResData() {
10     }
11  
12     public Object getSize() {
13         return Size;
14     }
15  
16     public void setSize(SizeData size) {
17         Size = size;
18     }
19  
20     @Override
21     public String toString() {
22         return "ResData{" +
23                 "xmlns='" + xmlns + '\'' +
24                 ", Url='" + Url + '\'' +
25                 ", Overlap='" + Overlap + '\'' +
26                 ", TileSize='" + TileSize + '\'' +
27                 ", Format='" + Format + '\'' +
28                 ", Size=" + Size +
29                 '}';
30     }
31  
32     public String getXmlns() {
33         return xmlns;
34     }
35  
36     public void setXmlns(String xmlns) {
37         this.xmlns = xmlns;
38     }
39  
40     public String getUrl() {
41         return Url;
42     }
43  
44     public void setUrl(String url) {
45         Url = url;
46     }
47  
48     public String getOverlap() {
49         return Overlap;
50     }
51  
52     public void setOverlap(String overlap) {
53         Overlap = overlap;
54     }
55  
56     public String getTileSize() {
57         return TileSize;
58     }
59  
60     public void setTileSize(String tileSize) {
61         TileSize = tileSize;
62     }
63  
64     public String getFormat() {
65         return Format;
66     }
67  
68     public void setFormat(String format) {
69         Format = format;
70     }
71 }

之后定义   Size.java

 1 public class SizeData {
 2     private String Height;
 3     private String Width;
 4  
 5     public SizeData() {
 6     }
 7  
 8     @Override
 9     public String toString() {
10         return "SizeData{" +
11                 "Height='" + Height + '\'' +
12                 ", Width='" + Width + '\'' +
13                 '}';
14     }
15  
16     public String getHeight() {
17         return Height;
18     }
19  
20     public void setHeight(String height) {
21         Height = height;
22     }
23  
24     public String getWidth() {
25         return Width;
26     }
27  
28     public void setWidth(String width) {
29         Width = width;
30     }
31 }

  然后在接口java中,引入上两个java,并处理接口返回逻辑

 1     @GetMapping("/image")
 2     public Object setInfo() {
 3         ResData resdata = new ResData();
 4         resdata.setFormat("格式");
 5         resdata.setOverlap("重叠像素");
 6         resdata.setTileSize("切割大小");
 7         resdata.setUrl("图片地址");
 8         resdata.setXmlns("命名空间");
 9         SizeData size = new SizeData();
10         size.setWidth("宽度");
11         size.setHeight("高度");
12         resdata.setSize(size);
13         JSONObject a = new JSONObject();
14         a.put("Image",resdata);
15         return a;
16     }

  至此,运行项目即可正确显示图像。

进阶

  虽然按照上述方法可以正确显示图像,但是对于接口返回的数据有着严格的要求,我们自己的项目返回格式肯定是经过了一些处理的,所以在实际的应用中前端可以采用如下方式加载图像。

首先,绑定元素

1 var viewer = OpenSeadragon({
2                 id: "openseadragon1",
3                 prefixUrl: root + "/public/img/seadragon/icon/",
4             });

  然后定义tileSource

var tileSource = new OpenSeadragon.TileSource;

  然后使用自己的ajax请求,向后端请求数据

 1 admin.req({
 2     url:root + "后端地址",
 3     method:"GET",
 4     contentType:"application/json",
 5     success:function(res){
 6         var data = res.body.data.Image;//数据处理
 7         tileSource = {//装载tileSource 
 8             Image: {
 9                 xmlns: data.xmlns,
10                 Url: data.Url,
11                 Overlap: data.Overlap,
12                 TileSize: data.TileSize,
13                 Format: data.Format,
14                 Size: {
15                     Height: data.Size.Height,
16                     Width: data.Size.Width
17                 }
18             }
19         };
20         viewer.open(tileSource)//将tileSource在viewer中打开
21     },
22     fail:function(err){
23     }
24 })

  这样做有什么好处?这样做之后你可以使用openseadragon中tileSource各种方法,例如success回调,举个栗子

 1 admin.req({
 2     url:root + "后端地址",
 3     method:"GET",
 4     contentType:"application/json",
 5     success:function(res){
 6         var data = res.body.data.Image;//数据处理
 7         tileSource = {//装载tileSource 
 8             Image: {
 9                 xmlns: data.xmlns,
10                 Url: data.Url,
11                 Overlap: data.Overlap,
12                 TileSize: data.TileSize,
13                 Format: data.Format,
14                 Size: {
15                     Height: data.Size.Height,
16                     Width: data.Size.Width
17                 }
18             },
19             success:function(){
20                 console.log("tileSource 成功装载")
21             }
22         };
23         viewer.open(tileSource)//将tileSource在viewer中打开
24     },
25     fail:function(err){
26     }
27 })

  因为ajax请求是异步操作,前端有时需要知道图像是否已在界面中成功打开,所以我们还可以进一步做监听

1 viewer.addHandler("open",function() {
2     console.log("图像打开成功");
3 });

  至此,你可以监听到openseadragon各个阶段的变化。还不赶快去找老板讨赏>_<

结束
  做到这里,一个成熟的基础项目框架已搭建完成。还有一个致命的问题,如果你使用的是阿里文件存储,且客户资料是保密的,还需要后端进行ajax请求拦截校验,并且阿里云那边也需要设置相应的拦截机制。

下一章会介绍openseadragon其他属性的应用,属于进阶教程。

posted on 2023-05-11 11:54  一杯清酒邀明月  阅读(759)  评论(0编辑  收藏  举报