large-image-source-openslide 1.32.11.dev6__py3-none-any.whl → 1.32.12.dev2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- large_image_source_openslide/__init__.py +32 -4
- {large_image_source_openslide-1.32.11.dev6.dist-info → large_image_source_openslide-1.32.12.dev2.dist-info}/METADATA +3 -3
- large_image_source_openslide-1.32.12.dev2.dist-info/RECORD +8 -0
- large_image_source_openslide-1.32.11.dev6.dist-info/RECORD +0 -8
- {large_image_source_openslide-1.32.11.dev6.dist-info → large_image_source_openslide-1.32.12.dev2.dist-info}/WHEEL +0 -0
- {large_image_source_openslide-1.32.11.dev6.dist-info → large_image_source_openslide-1.32.12.dev2.dist-info}/entry_points.txt +0 -0
- {large_image_source_openslide-1.32.11.dev6.dist-info → large_image_source_openslide-1.32.12.dev2.dist-info}/licenses/LICENSE +0 -0
- {large_image_source_openslide-1.32.11.dev6.dist-info → large_image_source_openslide-1.32.12.dev2.dist-info}/top_level.txt +0 -0
@@ -139,19 +139,22 @@ class OpenslideFileTileSource(FileTileSource, metaclass=LruCacheMetaclass):
|
|
139
139
|
# load an appropriate area and scale it to the tile size later.
|
140
140
|
maxSize = 16384 # This should probably be based on available memory
|
141
141
|
for level in range(self.levels):
|
142
|
-
|
143
|
-
|
142
|
+
levelpow = 2 ** (self.levels - 1 - level)
|
143
|
+
levelW = max(1, self.sizeX / levelpow)
|
144
|
+
levelH = max(1, self.sizeY / levelpow)
|
144
145
|
# bestlevel and scale will be the picked svs level and the scale
|
145
146
|
# between that level and what we really wanted. We expect scale to
|
146
147
|
# always be a positive integer power of two.
|
147
148
|
bestlevel = svsAvailableLevels[0]['level']
|
148
149
|
scale = 1
|
150
|
+
svsscale = 0
|
149
151
|
for svslevel in range(len(svsAvailableLevels)):
|
150
152
|
if (svsAvailableLevels[svslevel]['width'] < levelW - 1 or
|
151
153
|
svsAvailableLevels[svslevel]['height'] < levelH - 1):
|
152
154
|
break
|
153
155
|
bestlevel = svsAvailableLevels[svslevel]['level']
|
154
156
|
scale = int(round(svsAvailableLevels[svslevel]['width'] / levelW))
|
157
|
+
svsscale = svsAvailableLevels[svslevel].get('downsample', 0)
|
155
158
|
# If there are no tiles at a particular level, we have to read a
|
156
159
|
# larger area of a higher resolution level. If such an area would
|
157
160
|
# be excessively large, we could have memory issues, so raise an
|
@@ -165,6 +168,7 @@ class OpenslideFileTileSource(FileTileSource, metaclass=LruCacheMetaclass):
|
|
165
168
|
self._svslevels.append({
|
166
169
|
'svslevel': bestlevel,
|
167
170
|
'scale': scale,
|
171
|
+
'svsscale': ((svsscale / levelpow) if svsscale else 1) * scale,
|
168
172
|
})
|
169
173
|
self._bounds = None
|
170
174
|
try:
|
@@ -245,6 +249,7 @@ class OpenslideFileTileSource(FileTileSource, metaclass=LruCacheMetaclass):
|
|
245
249
|
"""
|
246
250
|
levels = []
|
247
251
|
svsLevelDimensions = self._openslide.level_dimensions
|
252
|
+
|
248
253
|
for svslevel in range(len(svsLevelDimensions)):
|
249
254
|
try:
|
250
255
|
self._openslide.read_region((0, 0), svslevel, (1, 1))
|
@@ -253,6 +258,10 @@ class OpenslideFileTileSource(FileTileSource, metaclass=LruCacheMetaclass):
|
|
253
258
|
'width': svsLevelDimensions[svslevel][0],
|
254
259
|
'height': svsLevelDimensions[svslevel][1],
|
255
260
|
}
|
261
|
+
try:
|
262
|
+
level['downsample'] = self._openslide.level_downsamples[svslevel]
|
263
|
+
except Exception:
|
264
|
+
pass
|
256
265
|
if level['width'] > 0 and level['height'] > 0:
|
257
266
|
# add to the list so that we can sort by resolution and
|
258
267
|
# then by earlier entries
|
@@ -344,12 +353,31 @@ class OpenslideFileTileSource(FileTileSource, metaclass=LruCacheMetaclass):
|
|
344
353
|
tile, format = self._getTileFromEmptyLevel(x, y, z, **kwargs)
|
345
354
|
else:
|
346
355
|
retries = 3
|
356
|
+
svsTileWidth = self.tileWidth * svslevel['scale']
|
357
|
+
svsTileHeight = self.tileHeight * svslevel['scale']
|
358
|
+
# Peculiarly, openslide has a "downsample" factor which isn't the
|
359
|
+
# power of 2 one would expect. This is computed based on the
|
360
|
+
# actual dimensions of levels, but since higher-resolution levels
|
361
|
+
# are not fully populated at the right and bottom, this ends up
|
362
|
+
# with not the actual downsampling, but some slightly higher number
|
363
|
+
# (e.g., 16.0018 rather than 16). Internally, when asking for a
|
364
|
+
# region for anything other than the maximum resolution lever, the
|
365
|
+
# openslide library is passed coordinates in what _seems_ to be
|
366
|
+
# base image coordinates, but is actually inflated by the ratio of
|
367
|
+
# their downsample value and the actual downsample value (e.g.,
|
368
|
+
# 16.0018 / 16). We multiple our values by this ratio so when
|
369
|
+
# openslide misapplies its downsampling we get the region we
|
370
|
+
# actually want
|
371
|
+
if svslevel['svsscale'] != 1:
|
372
|
+
offsetx = int(round(offsetx * svslevel['svsscale']))
|
373
|
+
offsety = int(round(offsety * svslevel['svsscale']))
|
374
|
+
svsTileWidth = int(round(svsTileWidth * svslevel['svsscale']))
|
375
|
+
svsTileHeight = int(round(svsTileHeight * svslevel['svsscale']))
|
347
376
|
while retries > 0:
|
348
377
|
try:
|
349
378
|
tile = self._openslide.read_region(
|
350
379
|
(offsetx, offsety), svslevel['svslevel'],
|
351
|
-
(
|
352
|
-
self.tileHeight * svslevel['scale']))
|
380
|
+
(svsTileWidth, svsTileHeight))
|
353
381
|
format = TILE_FORMAT_PIL
|
354
382
|
break
|
355
383
|
except openslide.lowlevel.OpenSlideError as exc:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: large-image-source-openslide
|
3
|
-
Version: 1.32.
|
3
|
+
Version: 1.32.12.dev2
|
4
4
|
Summary: An Openslide tilesource for large_image.
|
5
5
|
Home-page: https://github.com/girder/large_image
|
6
6
|
Author: Kitware, Inc.
|
@@ -18,7 +18,7 @@ Classifier: Programming Language :: Python :: 3.13
|
|
18
18
|
Requires-Python: >=3.8
|
19
19
|
Description-Content-Type: text/x-rst
|
20
20
|
License-File: LICENSE
|
21
|
-
Requires-Dist: large-image>=1.32.
|
21
|
+
Requires-Dist: large-image>=1.32.12.dev2
|
22
22
|
Requires-Dist: openslide-python>=1.4.1
|
23
23
|
Requires-Dist: openslide-bin; platform_system == "Linux" and platform_machine == "x86_64"
|
24
24
|
Requires-Dist: openslide-bin; platform_system == "Linux" and platform_machine == "aarch64"
|
@@ -27,7 +27,7 @@ Requires-Dist: openslide-bin; platform_system == "Darwin" and platform_machine =
|
|
27
27
|
Requires-Dist: openslide-bin; platform_system == "Darwin" and platform_machine == "x86_64"
|
28
28
|
Requires-Dist: tifftools>=1.2.0
|
29
29
|
Provides-Extra: girder
|
30
|
-
Requires-Dist: girder-large-image>=1.32.
|
30
|
+
Requires-Dist: girder-large-image>=1.32.12.dev2; extra == "girder"
|
31
31
|
Dynamic: author
|
32
32
|
Dynamic: author-email
|
33
33
|
Dynamic: classifier
|
@@ -0,0 +1,8 @@
|
|
1
|
+
large_image_source_openslide/__init__.py,sha256=CEfTufsAco3V87GHdRtJz7KbIuLrgu1vGyc5-dtOXd4,22822
|
2
|
+
large_image_source_openslide/girder_source.py,sha256=wPa7xBoJ5-PKHMVy9joUNSUHTN6HCZKyR45lhR0SsRc,1236
|
3
|
+
large_image_source_openslide-1.32.12.dev2.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
|
4
|
+
large_image_source_openslide-1.32.12.dev2.dist-info/METADATA,sha256=knWaS87mpdJ97crIbgsmbxuFSe7UA0kxUKtY5VXJb_I,1800
|
5
|
+
large_image_source_openslide-1.32.12.dev2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
6
|
+
large_image_source_openslide-1.32.12.dev2.dist-info/entry_points.txt,sha256=4Z5cf63yeesvHxiR9W1dY3rfz5_V4Ck2xYhPUp4A1qA,196
|
7
|
+
large_image_source_openslide-1.32.12.dev2.dist-info/top_level.txt,sha256=wqaQQDWQl9a_l9s6n07tTxfjeEXePtHBhz1np6aUwQE,29
|
8
|
+
large_image_source_openslide-1.32.12.dev2.dist-info/RECORD,,
|
@@ -1,8 +0,0 @@
|
|
1
|
-
large_image_source_openslide/__init__.py,sha256=hkBSua9o9HbGu_vvGfZfA3PZyJlfmHcJVALhofqr7Do,21117
|
2
|
-
large_image_source_openslide/girder_source.py,sha256=wPa7xBoJ5-PKHMVy9joUNSUHTN6HCZKyR45lhR0SsRc,1236
|
3
|
-
large_image_source_openslide-1.32.11.dev6.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
|
4
|
-
large_image_source_openslide-1.32.11.dev6.dist-info/METADATA,sha256=gGUa_4SNo1P8s6ZCWHjqACp307_2J-8LkdbJVLRR2tY,1800
|
5
|
-
large_image_source_openslide-1.32.11.dev6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
6
|
-
large_image_source_openslide-1.32.11.dev6.dist-info/entry_points.txt,sha256=4Z5cf63yeesvHxiR9W1dY3rfz5_V4Ck2xYhPUp4A1qA,196
|
7
|
-
large_image_source_openslide-1.32.11.dev6.dist-info/top_level.txt,sha256=wqaQQDWQl9a_l9s6n07tTxfjeEXePtHBhz1np6aUwQE,29
|
8
|
-
large_image_source_openslide-1.32.11.dev6.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|