20
20
21
21
"""An example program to generate a Deep Zoom directory tree from a slide."""
22
22
23
+ import json
23
24
from multiprocessing import Process , JoinableQueue
24
25
from openslide import open_slide , ImageSlide
25
26
from openslide .deepzoom import DeepZoomGenerator
@@ -110,7 +111,10 @@ def _tile_done(self):
110
111
111
112
def _write_dzi (self ):
112
113
with open ('%s.dzi' % self ._basename , 'w' ) as fh :
113
- fh .write (self ._dz .get_dzi (self ._format ))
114
+ fh .write (self .get_dzi ())
115
+
116
+ def get_dzi (self ):
117
+ return self ._dz .get_dzi (self ._format )
114
118
115
119
116
120
class DeepZoomStaticTiler (object ):
@@ -126,6 +130,7 @@ def __init__(self, slidepath, basename, format, tile_size, overlap,
126
130
self ._queue = JoinableQueue (2 * workers )
127
131
self ._workers = workers
128
132
self ._with_viewer = with_viewer
133
+ self ._dzi_data = {}
129
134
for _i in range (workers ):
130
135
TileWorker (self ._queue , slidepath , tile_size , overlap ).start ()
131
136
@@ -150,8 +155,10 @@ def _run_image(self, associated=None):
150
155
image = ImageSlide (self ._slide .associated_images [associated ])
151
156
basename = os .path .join (self ._basename , self ._slugify (associated ))
152
157
dz = DeepZoomGenerator (image , self ._tile_size , self ._overlap )
153
- DeepZoomImageTiler (dz , basename , self ._format , associated ,
154
- self ._queue ).run ()
158
+ tiler = DeepZoomImageTiler (dz , basename , self ._format , associated ,
159
+ self ._queue )
160
+ tiler .run ()
161
+ self ._dzi_data [self ._url_for (associated )] = tiler .get_dzi ()
155
162
156
163
def _url_for (self , associated ):
157
164
if associated is None :
@@ -167,9 +174,13 @@ def _write_html(self):
167
174
template = env .get_template ('index.html' )
168
175
associated_urls = dict ((n , self ._url_for (n ))
169
176
for n in self ._slide .associated_images )
177
+ # Embed the dzi metadata in the HTML to work around Chrome's
178
+ # refusal to allow XmlHttpRequest from file:///, even when
179
+ # the originating page is also a file:///
170
180
data = template .render (slide_url = self ._url_for (None ),
171
181
associated = associated_urls ,
172
- properties = self ._slide .properties )
182
+ properties = self ._slide .properties ,
183
+ dzi_data = json .dumps (self ._dzi_data ))
173
184
with open (os .path .join (self ._basename , 'index.html' ), 'w' ) as fh :
174
185
fh .write (data )
175
186
0 commit comments