large-image-source-openslide 1.32.7.dev6__tar.gz → 1.33.5.dev6__tar.gz

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.

Potentially problematic release.


This version of large-image-source-openslide might be problematic. Click here for more details.

Files changed (14) hide show
  1. {large_image_source_openslide-1.32.7.dev6 → large_image_source_openslide-1.33.5.dev6}/PKG-INFO +4 -5
  2. {large_image_source_openslide-1.32.7.dev6 → large_image_source_openslide-1.33.5.dev6}/large_image_source_openslide/__init__.py +34 -5
  3. {large_image_source_openslide-1.32.7.dev6 → large_image_source_openslide-1.33.5.dev6}/large_image_source_openslide/girder_source.py +2 -2
  4. {large_image_source_openslide-1.32.7.dev6 → large_image_source_openslide-1.33.5.dev6}/large_image_source_openslide.egg-info/PKG-INFO +4 -5
  5. {large_image_source_openslide-1.32.7.dev6 → large_image_source_openslide-1.33.5.dev6}/large_image_source_openslide.egg-info/requires.txt +2 -2
  6. {large_image_source_openslide-1.32.7.dev6 → large_image_source_openslide-1.33.5.dev6}/setup.py +1 -2
  7. {large_image_source_openslide-1.32.7.dev6 → large_image_source_openslide-1.33.5.dev6}/LICENSE +0 -0
  8. {large_image_source_openslide-1.32.7.dev6 → large_image_source_openslide-1.33.5.dev6}/README.rst +0 -0
  9. {large_image_source_openslide-1.32.7.dev6 → large_image_source_openslide-1.33.5.dev6}/large_image_source_openslide.egg-info/SOURCES.txt +0 -0
  10. {large_image_source_openslide-1.32.7.dev6 → large_image_source_openslide-1.33.5.dev6}/large_image_source_openslide.egg-info/dependency_links.txt +0 -0
  11. {large_image_source_openslide-1.32.7.dev6 → large_image_source_openslide-1.33.5.dev6}/large_image_source_openslide.egg-info/entry_points.txt +0 -0
  12. {large_image_source_openslide-1.32.7.dev6 → large_image_source_openslide-1.33.5.dev6}/large_image_source_openslide.egg-info/top_level.txt +0 -0
  13. {large_image_source_openslide-1.32.7.dev6 → large_image_source_openslide-1.33.5.dev6}/pyproject.toml +0 -0
  14. {large_image_source_openslide-1.32.7.dev6 → large_image_source_openslide-1.33.5.dev6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: large-image-source-openslide
3
- Version: 1.32.7.dev6
3
+ Version: 1.33.5.dev6
4
4
  Summary: An Openslide tilesource for large_image.
5
5
  Home-page: https://github.com/girder/large_image
6
6
  Author: Kitware, Inc.
@@ -9,16 +9,15 @@ License: Apache-2.0
9
9
  Keywords: large_image,tile source
10
10
  Classifier: Development Status :: 5 - Production/Stable
11
11
  Classifier: Programming Language :: Python :: 3
12
- Classifier: Programming Language :: Python :: 3.8
13
12
  Classifier: Programming Language :: Python :: 3.9
14
13
  Classifier: Programming Language :: Python :: 3.10
15
14
  Classifier: Programming Language :: Python :: 3.11
16
15
  Classifier: Programming Language :: Python :: 3.12
17
16
  Classifier: Programming Language :: Python :: 3.13
18
- Requires-Python: >=3.8
17
+ Requires-Python: >=3.9
19
18
  Description-Content-Type: text/x-rst
20
19
  License-File: LICENSE
21
- Requires-Dist: large-image>=1.32.7.dev6
20
+ Requires-Dist: large-image>=1.33.5.dev6
22
21
  Requires-Dist: openslide-python>=1.4.1
23
22
  Requires-Dist: openslide-bin; platform_system == "Linux" and platform_machine == "x86_64"
24
23
  Requires-Dist: openslide-bin; platform_system == "Linux" and platform_machine == "aarch64"
@@ -27,7 +26,7 @@ Requires-Dist: openslide-bin; platform_system == "Darwin" and platform_machine =
27
26
  Requires-Dist: openslide-bin; platform_system == "Darwin" and platform_machine == "x86_64"
28
27
  Requires-Dist: tifftools>=1.2.0
29
28
  Provides-Extra: girder
30
- Requires-Dist: girder-large-image>=1.32.7.dev6; extra == "girder"
29
+ Requires-Dist: girder-large-image>=1.33.5.dev6; extra == "girder"
31
30
  Dynamic: author
32
31
  Dynamic: author-email
33
32
  Dynamic: classifier
@@ -49,7 +49,7 @@ class OpenslideFileTileSource(FileTileSource, metaclass=LruCacheMetaclass):
49
49
  None: SourcePriority.MEDIUM,
50
50
  'bif': SourcePriority.LOW, # Ventana
51
51
  'czi': SourcePriority.PREFERRED,
52
- 'dcm': SourcePriority.LOW, # DICOM
52
+ 'dcm': SourcePriority.MEDIUM, # DICOM
53
53
  'ini': SourcePriority.LOW, # Part of mrxs
54
54
  'mrxs': SourcePriority.PREFERRED, # MIRAX
55
55
  'ndpi': SourcePriority.PREFERRED, # Hamamatsu
@@ -64,6 +64,7 @@ class OpenslideFileTileSource(FileTileSource, metaclass=LruCacheMetaclass):
64
64
  mimeTypes = {
65
65
  None: SourcePriority.FALLBACK,
66
66
  'image/czi': SourcePriority.PREFERRED,
67
+ 'application/dicom': SourcePriority.MEDIUM,
67
68
  'image/mirax': SourcePriority.PREFERRED, # MIRAX
68
69
  'image/tiff': SourcePriority.MEDIUM,
69
70
  'image/x-tiff': SourcePriority.MEDIUM,
@@ -138,19 +139,22 @@ class OpenslideFileTileSource(FileTileSource, metaclass=LruCacheMetaclass):
138
139
  # load an appropriate area and scale it to the tile size later.
139
140
  maxSize = 16384 # This should probably be based on available memory
140
141
  for level in range(self.levels):
141
- levelW = max(1, self.sizeX / 2 ** (self.levels - 1 - level))
142
- 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)
143
145
  # bestlevel and scale will be the picked svs level and the scale
144
146
  # between that level and what we really wanted. We expect scale to
145
147
  # always be a positive integer power of two.
146
148
  bestlevel = svsAvailableLevels[0]['level']
147
149
  scale = 1
150
+ svsscale = 0
148
151
  for svslevel in range(len(svsAvailableLevels)):
149
152
  if (svsAvailableLevels[svslevel]['width'] < levelW - 1 or
150
153
  svsAvailableLevels[svslevel]['height'] < levelH - 1):
151
154
  break
152
155
  bestlevel = svsAvailableLevels[svslevel]['level']
153
156
  scale = int(round(svsAvailableLevels[svslevel]['width'] / levelW))
157
+ svsscale = svsAvailableLevels[svslevel].get('downsample', 0)
154
158
  # If there are no tiles at a particular level, we have to read a
155
159
  # larger area of a higher resolution level. If such an area would
156
160
  # be excessively large, we could have memory issues, so raise an
@@ -164,6 +168,7 @@ class OpenslideFileTileSource(FileTileSource, metaclass=LruCacheMetaclass):
164
168
  self._svslevels.append({
165
169
  'svslevel': bestlevel,
166
170
  'scale': scale,
171
+ 'svsscale': ((svsscale / levelpow) if svsscale else 1) * scale,
167
172
  })
168
173
  self._bounds = None
169
174
  try:
@@ -244,6 +249,7 @@ class OpenslideFileTileSource(FileTileSource, metaclass=LruCacheMetaclass):
244
249
  """
245
250
  levels = []
246
251
  svsLevelDimensions = self._openslide.level_dimensions
252
+
247
253
  for svslevel in range(len(svsLevelDimensions)):
248
254
  try:
249
255
  self._openslide.read_region((0, 0), svslevel, (1, 1))
@@ -252,6 +258,10 @@ class OpenslideFileTileSource(FileTileSource, metaclass=LruCacheMetaclass):
252
258
  'width': svsLevelDimensions[svslevel][0],
253
259
  'height': svsLevelDimensions[svslevel][1],
254
260
  }
261
+ try:
262
+ level['downsample'] = self._openslide.level_downsamples[svslevel]
263
+ except Exception:
264
+ pass
255
265
  if level['width'] > 0 and level['height'] > 0:
256
266
  # add to the list so that we can sort by resolution and
257
267
  # then by earlier entries
@@ -343,12 +353,31 @@ class OpenslideFileTileSource(FileTileSource, metaclass=LruCacheMetaclass):
343
353
  tile, format = self._getTileFromEmptyLevel(x, y, z, **kwargs)
344
354
  else:
345
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']))
346
376
  while retries > 0:
347
377
  try:
348
378
  tile = self._openslide.read_region(
349
379
  (offsetx, offsety), svslevel['svslevel'],
350
- (self.tileWidth * svslevel['scale'],
351
- self.tileHeight * svslevel['scale']))
380
+ (svsTileWidth, svsTileHeight))
352
381
  format = TILE_FORMAT_PIL
353
382
  break
354
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.7.dev6
3
+ Version: 1.33.5.dev6
4
4
  Summary: An Openslide tilesource for large_image.
5
5
  Home-page: https://github.com/girder/large_image
6
6
  Author: Kitware, Inc.
@@ -9,16 +9,15 @@ License: Apache-2.0
9
9
  Keywords: large_image,tile source
10
10
  Classifier: Development Status :: 5 - Production/Stable
11
11
  Classifier: Programming Language :: Python :: 3
12
- Classifier: Programming Language :: Python :: 3.8
13
12
  Classifier: Programming Language :: Python :: 3.9
14
13
  Classifier: Programming Language :: Python :: 3.10
15
14
  Classifier: Programming Language :: Python :: 3.11
16
15
  Classifier: Programming Language :: Python :: 3.12
17
16
  Classifier: Programming Language :: Python :: 3.13
18
- Requires-Python: >=3.8
17
+ Requires-Python: >=3.9
19
18
  Description-Content-Type: text/x-rst
20
19
  License-File: LICENSE
21
- Requires-Dist: large-image>=1.32.7.dev6
20
+ Requires-Dist: large-image>=1.33.5.dev6
22
21
  Requires-Dist: openslide-python>=1.4.1
23
22
  Requires-Dist: openslide-bin; platform_system == "Linux" and platform_machine == "x86_64"
24
23
  Requires-Dist: openslide-bin; platform_system == "Linux" and platform_machine == "aarch64"
@@ -27,7 +26,7 @@ Requires-Dist: openslide-bin; platform_system == "Darwin" and platform_machine =
27
26
  Requires-Dist: openslide-bin; platform_system == "Darwin" and platform_machine == "x86_64"
28
27
  Requires-Dist: tifftools>=1.2.0
29
28
  Provides-Extra: girder
30
- Requires-Dist: girder-large-image>=1.32.7.dev6; extra == "girder"
29
+ Requires-Dist: girder-large-image>=1.33.5.dev6; extra == "girder"
31
30
  Dynamic: author
32
31
  Dynamic: author-email
33
32
  Dynamic: classifier
@@ -1,4 +1,4 @@
1
- large-image>=1.32.7.dev6
1
+ large-image>=1.33.5.dev6
2
2
  openslide-python>=1.4.1
3
3
  tifftools>=1.2.0
4
4
 
@@ -18,4 +18,4 @@ openslide-bin
18
18
  openslide-bin
19
19
 
20
20
  [girder]
21
- girder-large-image>=1.32.7.dev6
21
+ girder-large-image>=1.33.5.dev6
@@ -25,13 +25,13 @@ setup(
25
25
  classifiers=[
26
26
  'Development Status :: 5 - Production/Stable',
27
27
  'Programming Language :: Python :: 3',
28
- 'Programming Language :: Python :: 3.8',
29
28
  'Programming Language :: Python :: 3.9',
30
29
  'Programming Language :: Python :: 3.10',
31
30
  'Programming Language :: Python :: 3.11',
32
31
  'Programming Language :: Python :: 3.12',
33
32
  'Programming Language :: Python :: 3.13',
34
33
  ],
34
+ python_requires='>=3.9',
35
35
  install_requires=[
36
36
  f'large-image{limit_version}',
37
37
  'openslide-python>=1.4.1',
@@ -48,7 +48,6 @@ setup(
48
48
  keywords='large_image, tile source',
49
49
  packages=find_packages(exclude=['test', 'test.*']),
50
50
  url='https://github.com/girder/large_image',
51
- python_requires='>=3.8',
52
51
  entry_points={
53
52
  'large_image.source': [
54
53
  'openslide = large_image_source_openslide:OpenslideFileTileSource',