large-image-source-openslide 1.32.10.dev8__py3-none-any.whl → 1.32.11__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.
@@ -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
- levelW = max(1, self.sizeX / 2 ** (self.levels - 1 - level))
143
- levelH = max(1, self.sizeY / 2 ** (self.levels - 1 - level))
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
- (self.tileWidth * svslevel['scale'],
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:
@@ -28,5 +28,5 @@ class OpenslideGirderTileSource(OpenslideFileTileSource, GirderTileSource):
28
28
  cacheName = 'tilesource'
29
29
  name = 'openslide'
30
30
 
31
- extensionsWithAdjacentFiles = {'mrxs'}
32
- mimeTypesWithAdjacentFiles = {'image/mirax'}
31
+ extensionsWithAdjacentFiles = {'mrxs', 'dcm', 'dicom'}
32
+ mimeTypesWithAdjacentFiles = {'image/mirax', 'application/dicom'}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: large-image-source-openslide
3
- Version: 1.32.10.dev8
3
+ Version: 1.32.11
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.10.dev8
21
+ Requires-Dist: large-image>=1.32.11
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.10.dev8; extra == "girder"
30
+ Requires-Dist: girder-large-image>=1.32.11; 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.11.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
4
+ large_image_source_openslide-1.32.11.dist-info/METADATA,sha256=XdxTllpENmmCeRXTivVzXCqwk6RmMp00LCq9UHvGV_M,1785
5
+ large_image_source_openslide-1.32.11.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
6
+ large_image_source_openslide-1.32.11.dist-info/entry_points.txt,sha256=4Z5cf63yeesvHxiR9W1dY3rfz5_V4Ck2xYhPUp4A1qA,196
7
+ large_image_source_openslide-1.32.11.dist-info/top_level.txt,sha256=wqaQQDWQl9a_l9s6n07tTxfjeEXePtHBhz1np6aUwQE,29
8
+ large_image_source_openslide-1.32.11.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=ntLgOinO7xcO85wFbjx6XEBmTgEtx5cuPZ_K6wXZzqA,1199
3
- large_image_source_openslide-1.32.10.dev8.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
4
- large_image_source_openslide-1.32.10.dev8.dist-info/METADATA,sha256=Sqccfx5zpwYWOOZJ2MN7GDKC2_mwnMRv9o1KfWa22U0,1800
5
- large_image_source_openslide-1.32.10.dev8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
6
- large_image_source_openslide-1.32.10.dev8.dist-info/entry_points.txt,sha256=4Z5cf63yeesvHxiR9W1dY3rfz5_V4Ck2xYhPUp4A1qA,196
7
- large_image_source_openslide-1.32.10.dev8.dist-info/top_level.txt,sha256=wqaQQDWQl9a_l9s6n07tTxfjeEXePtHBhz1np6aUwQE,29
8
- large_image_source_openslide-1.32.10.dev8.dist-info/RECORD,,