Skip to content

Commit 67eb93b

Browse files
committed
deepzoom-tile: Fix running viewer from local disk on Chrome
1 parent c6bf2fd commit 67eb93b

File tree

2 files changed

+19
-6
lines changed

2 files changed

+19
-6
lines changed

examples/deepzoom/deepzoom-tile.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
"""An example program to generate a Deep Zoom directory tree from a slide."""
2222

23+
import json
2324
from multiprocessing import Process, JoinableQueue
2425
from openslide import open_slide, ImageSlide
2526
from openslide.deepzoom import DeepZoomGenerator
@@ -110,7 +111,10 @@ def _tile_done(self):
110111

111112
def _write_dzi(self):
112113
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)
114118

115119

116120
class DeepZoomStaticTiler(object):
@@ -126,6 +130,7 @@ def __init__(self, slidepath, basename, format, tile_size, overlap,
126130
self._queue = JoinableQueue(2 * workers)
127131
self._workers = workers
128132
self._with_viewer = with_viewer
133+
self._dzi_data = {}
129134
for _i in range(workers):
130135
TileWorker(self._queue, slidepath, tile_size, overlap).start()
131136

@@ -150,8 +155,10 @@ def _run_image(self, associated=None):
150155
image = ImageSlide(self._slide.associated_images[associated])
151156
basename = os.path.join(self._basename, self._slugify(associated))
152157
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()
155162

156163
def _url_for(self, associated):
157164
if associated is None:
@@ -167,9 +174,13 @@ def _write_html(self):
167174
template = env.get_template('index.html')
168175
associated_urls = dict((n, self._url_for(n))
169176
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:///
170180
data = template.render(slide_url=self._url_for(None),
171181
associated=associated_urls,
172-
properties=self._slide.properties)
182+
properties=self._slide.properties,
183+
dzi_data=json.dumps(self._dzi_data))
173184
with open(os.path.join(self._basename, 'index.html'), 'w') as fh:
174185
fh.write(data)
175186

examples/deepzoom/templates/index.html

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,16 @@
77

88
<script type="text/javascript">
99
$(document).ready(function() {
10+
var dzi_data = {{ dzi_data|default('{}')|safe }};
1011
var viewer = new Seadragon.Viewer("view");
11-
viewer.openDzi("{{ slide_url }}");
12+
viewer.openDzi("{{ slide_url }}", dzi_data["{{ slide_url }}"]);
1213
viewer.config.animationTime = 0.5;
1314
viewer.config.blendTime = 0.1;
1415
$(".load-slide").click(function(ev) {
1516
$(".current-slide").removeClass("current-slide");
1617
$(this).parent().addClass("current-slide");
17-
viewer.openDzi($(this).attr('data-url'));
18+
var url = $(this).attr('data-url');
19+
viewer.openDzi(url, dzi_data[url]);
1820
ev.preventDefault();
1921
});
2022
});

0 commit comments

Comments
 (0)