Skip to content

Commit 40518bc

Browse files
committed
examples/deepzoom: Add command-line option to control JPEG quality
1 parent 5b94373 commit 40518bc

File tree

2 files changed

+14
-6
lines changed

2 files changed

+14
-6
lines changed

examples/deepzoom/deepzoom_server.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
DEEPZOOM_FORMAT = 'jpeg'
3131
DEEPZOOM_TILE_SIZE = 256
3232
DEEPZOOM_OVERLAP = 1
33+
DEEPZOOM_TILE_QUALITY = 75
3334
SLIDE_NAME = 'slide'
3435

3536
app = Flask(__name__)
@@ -96,7 +97,7 @@ def tile(slug, level, col, row, format):
9697
# Invalid level or coordinates
9798
abort(404)
9899
buf = StringIO()
99-
tile.save(buf, format, quality=75)
100+
tile.save(buf, format, quality=app.config['DEEPZOOM_TILE_QUALITY'])
100101
resp = make_response(buf.getvalue())
101102
resp.mimetype = 'image/%s' % format
102103
return resp
@@ -132,6 +133,9 @@ def slugify(text, delim=u'-'):
132133
parser.add_option('-p', '--port', metavar='PORT', dest='port',
133134
type='int', default=5000,
134135
help='port to listen on [5000]')
136+
parser.add_option('-q', '--quality', metavar='QUALITY',
137+
dest='DEEPZOOM_TILE_QUALITY', type='int',
138+
help='JPEG compression quality [75]')
135139
parser.add_option('-s', '--size', metavar='PIXELS',
136140
dest='DEEPZOOM_TILE_SIZE', type='int',
137141
help='tile size [256]')

examples/deepzoom/deepzoom_tile.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,14 @@
3636
class TileWorker(Process):
3737
"""A child process that generates and writes tiles."""
3838

39-
def __init__(self, queue, slidepath, tile_size, overlap):
39+
def __init__(self, queue, slidepath, tile_size, overlap, quality):
4040
Process.__init__(self, name='TileWorker')
4141
self.daemon = True
4242
self._queue = queue
4343
self._slidepath = slidepath
4444
self._tile_size = tile_size
4545
self._overlap = overlap
46+
self._quality = quality
4647
self._slide = None
4748

4849
def run(self):
@@ -59,7 +60,7 @@ def run(self):
5960
dz = self._get_dz(associated)
6061
last_associated = associated
6162
tile = dz.get_tile(level, address)
62-
tile.save(outfile, quality=90)
63+
tile.save(outfile, quality=self._quality)
6364
self._queue.task_done()
6465

6566
def _get_dz(self, associated=None):
@@ -121,7 +122,7 @@ class DeepZoomStaticTiler(object):
121122
"""Handles generation of tiles and metadata for all images in a slide."""
122123

123124
def __init__(self, slidepath, basename, format, tile_size, overlap,
124-
workers, with_viewer):
125+
quality, workers, with_viewer):
125126
if with_viewer:
126127
# Check extra dependency before doing a bunch of work
127128
import jinja2
@@ -135,7 +136,7 @@ def __init__(self, slidepath, basename, format, tile_size, overlap,
135136
self._with_viewer = with_viewer
136137
self._dzi_data = {}
137138
for _i in range(workers):
138-
TileWorker(self._queue, slidepath, tile_size, overlap).start()
139+
TileWorker(self._queue, slidepath, tile_size, overlap, quality).start()
139140

140141
def run(self):
141142
self._run_image()
@@ -234,6 +235,9 @@ def _shutdown(self):
234235
help='number of worker processes to start [4]')
235236
parser.add_option('-o', '--output', metavar='NAME', dest='basename',
236237
help='base name of output file')
238+
parser.add_option('-q', '--quality', metavar='QUALITY', dest='quality',
239+
type='int', default=90,
240+
help='JPEG compression quality [90]')
237241
parser.add_option('-r', '--viewer', dest='with_viewer',
238242
action='store_true',
239243
help='generate directory tree with HTML viewer')
@@ -250,5 +254,5 @@ def _shutdown(self):
250254
opts.basename = os.path.splitext(os.path.basename(slidepath))[0]
251255

252256
DeepZoomStaticTiler(slidepath, opts.basename, opts.format,
253-
opts.tile_size, opts.overlap, opts.workers,
257+
opts.tile_size, opts.overlap, opts.quality, opts.workers,
254258
opts.with_viewer).run()

0 commit comments

Comments
 (0)