large-image 1.30.7.dev33__tar.gz → 1.30.7.dev68__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.
Files changed (65) hide show
  1. {large_image-1.30.7.dev33/large_image.egg-info → large_image-1.30.7.dev68}/PKG-INFO +83 -76
  2. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/tilesource/base.py +12 -11
  3. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/tilesource/jupyter.py +106 -23
  4. large_image-1.30.7.dev68/large_image/widgets/CompositeLayers.vue +618 -0
  5. large_image-1.30.7.dev68/large_image/widgets/DualInput.vue +127 -0
  6. large_image-1.30.7.dev68/large_image/widgets/FrameSelector.vue +434 -0
  7. large_image-1.30.7.dev68/large_image/widgets/HistogramEditor.vue +455 -0
  8. large_image-1.30.7.dev68/large_image/widgets/colors.json +77 -0
  9. large_image-1.30.7.dev68/large_image/widgets/components.py +38 -0
  10. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68/large_image.egg-info}/PKG-INFO +83 -76
  11. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image.egg-info/SOURCES.txt +7 -1
  12. large_image-1.30.7.dev68/large_image.egg-info/requires.txt +159 -0
  13. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/setup.py +1 -0
  14. large_image-1.30.7.dev33/large_image.egg-info/requires.txt +0 -151
  15. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/LICENSE +0 -0
  16. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/NOTICE +0 -0
  17. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/README.rst +0 -0
  18. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/annotations.rst +0 -0
  19. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/api_index.rst +0 -0
  20. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/caching.rst +0 -0
  21. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/conf.py +0 -0
  22. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/config_options.rst +0 -0
  23. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/development.rst +0 -0
  24. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/dicomweb_assetstore.rst +0 -0
  25. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/format_examples_datastore.py +0 -0
  26. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/formats.rst +0 -0
  27. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/generate_format_table.py +0 -0
  28. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/getting_started.rst +0 -0
  29. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/girder_annotation_config_options.rst +0 -0
  30. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/girder_caching.rst +0 -0
  31. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/girder_config_options.rst +0 -0
  32. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/girder_index.rst +0 -0
  33. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/image_conversion.rst +0 -0
  34. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/index.rst +0 -0
  35. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/make_docs.sh +0 -0
  36. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/multi_source_specification.rst +0 -0
  37. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/notebooks/large_image_examples.ipynb +0 -0
  38. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/notebooks/zarr_sink_example.ipynb +0 -0
  39. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/notebooks.rst +0 -0
  40. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/plottable.rst +0 -0
  41. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/static/K.png +0 -0
  42. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/static/custom.css +0 -0
  43. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/tilesource_options.rst +0 -0
  44. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/upgrade.rst +0 -0
  45. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/__init__.py +0 -0
  46. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/cache_util/__init__.py +0 -0
  47. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/cache_util/base.py +0 -0
  48. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/cache_util/cache.py +0 -0
  49. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/cache_util/cachefactory.py +0 -0
  50. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/cache_util/memcache.py +0 -0
  51. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/cache_util/rediscache.py +0 -0
  52. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/config.py +0 -0
  53. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/constants.py +0 -0
  54. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/exceptions.py +0 -0
  55. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/tilesource/__init__.py +0 -0
  56. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/tilesource/geo.py +0 -0
  57. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/tilesource/resample.py +0 -0
  58. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/tilesource/stylefuncs.py +0 -0
  59. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/tilesource/tiledict.py +0 -0
  60. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/tilesource/tileiterator.py +0 -0
  61. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/tilesource/utilities.py +0 -0
  62. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image.egg-info/dependency_links.txt +0 -0
  63. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image.egg-info/not-zip-safe +0 -0
  64. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image.egg-info/top_level.txt +0 -0
  65. {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: large-image
3
- Version: 1.30.7.dev33
3
+ Version: 1.30.7.dev68
4
4
  Summary: Python modules to work with large, multiresolution images.
5
5
  Home-page: https://github.com/girder/large_image
6
6
  Author: Kitware, Inc.
@@ -30,116 +30,123 @@ Requires-Dist: pylibmc>=1.5.1; platform_system != "Windows" and extra == "memcac
30
30
  Provides-Extra: redis
31
31
  Requires-Dist: redis>=4.5.5; extra == "redis"
32
32
  Provides-Extra: converter
33
- Requires-Dist: large-image-converter>=1.30.7.dev33; extra == "converter"
33
+ Requires-Dist: large-image-converter>=1.30.7.dev68; extra == "converter"
34
34
  Provides-Extra: colormaps
35
35
  Requires-Dist: matplotlib; extra == "colormaps"
36
36
  Requires-Dist: tol_colors; extra == "colormaps"
37
+ Provides-Extra: jupyter
38
+ Requires-Dist: aiohttp; extra == "jupyter"
39
+ Requires-Dist: ipyvue; extra == "jupyter"
40
+ Requires-Dist: ipyleaflet; extra == "jupyter"
37
41
  Provides-Extra: tiledoutput
38
42
  Requires-Dist: pyvips; extra == "tiledoutput"
39
43
  Provides-Extra: performance
40
44
  Requires-Dist: psutil>=4.2.0; extra == "performance"
41
45
  Requires-Dist: simplejpeg; extra == "performance"
42
46
  Provides-Extra: bioformats
43
- Requires-Dist: large-image-source-bioformats>=1.30.7.dev33; extra == "bioformats"
47
+ Requires-Dist: large-image-source-bioformats>=1.30.7.dev68; extra == "bioformats"
44
48
  Provides-Extra: deepzoom
45
- Requires-Dist: large-image-source-deepzoom>=1.30.7.dev33; extra == "deepzoom"
49
+ Requires-Dist: large-image-source-deepzoom>=1.30.7.dev68; extra == "deepzoom"
46
50
  Provides-Extra: dicom
47
- Requires-Dist: large-image-source-dicom>=1.30.7.dev33; extra == "dicom"
51
+ Requires-Dist: large-image-source-dicom>=1.30.7.dev68; extra == "dicom"
48
52
  Provides-Extra: dummy
49
- Requires-Dist: large-image-source-dummy>=1.30.7.dev33; extra == "dummy"
53
+ Requires-Dist: large-image-source-dummy>=1.30.7.dev68; extra == "dummy"
50
54
  Provides-Extra: gdal
51
- Requires-Dist: large-image-source-gdal>=1.30.7.dev33; extra == "gdal"
55
+ Requires-Dist: large-image-source-gdal>=1.30.7.dev68; extra == "gdal"
52
56
  Provides-Extra: mapnik
53
- Requires-Dist: large-image-source-mapnik>=1.30.7.dev33; extra == "mapnik"
57
+ Requires-Dist: large-image-source-mapnik>=1.30.7.dev68; extra == "mapnik"
54
58
  Provides-Extra: multi
55
- Requires-Dist: large-image-source-multi>=1.30.7.dev33; extra == "multi"
59
+ Requires-Dist: large-image-source-multi>=1.30.7.dev68; extra == "multi"
56
60
  Provides-Extra: nd2
57
- Requires-Dist: large-image-source-nd2>=1.30.7.dev33; extra == "nd2"
61
+ Requires-Dist: large-image-source-nd2>=1.30.7.dev68; extra == "nd2"
58
62
  Provides-Extra: ometiff
59
- Requires-Dist: large-image-source-ometiff>=1.30.7.dev33; extra == "ometiff"
63
+ Requires-Dist: large-image-source-ometiff>=1.30.7.dev68; extra == "ometiff"
60
64
  Provides-Extra: openjpeg
61
- Requires-Dist: large-image-source-openjpeg>=1.30.7.dev33; extra == "openjpeg"
65
+ Requires-Dist: large-image-source-openjpeg>=1.30.7.dev68; extra == "openjpeg"
62
66
  Provides-Extra: openslide
63
- Requires-Dist: large-image-source-openslide>=1.30.7.dev33; extra == "openslide"
67
+ Requires-Dist: large-image-source-openslide>=1.30.7.dev68; extra == "openslide"
64
68
  Provides-Extra: pil
65
- Requires-Dist: large-image-source-pil>=1.30.7.dev33; extra == "pil"
69
+ Requires-Dist: large-image-source-pil>=1.30.7.dev68; extra == "pil"
66
70
  Provides-Extra: rasterio
67
- Requires-Dist: large-image-source-rasterio>=1.30.7.dev33; extra == "rasterio"
71
+ Requires-Dist: large-image-source-rasterio>=1.30.7.dev68; extra == "rasterio"
68
72
  Provides-Extra: test
69
- Requires-Dist: large-image-source-test>=1.30.7.dev33; extra == "test"
73
+ Requires-Dist: large-image-source-test>=1.30.7.dev68; extra == "test"
70
74
  Provides-Extra: tiff
71
- Requires-Dist: large-image-source-tiff>=1.30.7.dev33; extra == "tiff"
75
+ Requires-Dist: large-image-source-tiff>=1.30.7.dev68; extra == "tiff"
72
76
  Provides-Extra: tifffile
73
- Requires-Dist: large-image-source-tifffile>=1.30.7.dev33; extra == "tifffile"
77
+ Requires-Dist: large-image-source-tifffile>=1.30.7.dev68; extra == "tifffile"
74
78
  Provides-Extra: vips
75
- Requires-Dist: large-image-source-vips>=1.30.7.dev33; extra == "vips"
79
+ Requires-Dist: large-image-source-vips>=1.30.7.dev68; extra == "vips"
76
80
  Provides-Extra: zarr
77
- Requires-Dist: large-image-source-zarr>=1.30.7.dev33; extra == "zarr"
81
+ Requires-Dist: large-image-source-zarr>=1.30.7.dev68; extra == "zarr"
78
82
  Provides-Extra: sources
79
- Requires-Dist: large-image-source-bioformats>=1.30.7.dev33; extra == "sources"
80
- Requires-Dist: large-image-source-rasterio>=1.30.7.dev33; extra == "sources"
81
- Requires-Dist: large-image-source-openjpeg>=1.30.7.dev33; extra == "sources"
82
- Requires-Dist: large-image-source-zarr>=1.30.7.dev33; extra == "sources"
83
- Requires-Dist: large-image-source-openslide>=1.30.7.dev33; extra == "sources"
84
- Requires-Dist: large-image-source-vips>=1.30.7.dev33; extra == "sources"
85
- Requires-Dist: large-image-source-mapnik>=1.30.7.dev33; extra == "sources"
86
- Requires-Dist: large-image-source-multi>=1.30.7.dev33; extra == "sources"
87
- Requires-Dist: large-image-source-nd2>=1.30.7.dev33; extra == "sources"
88
- Requires-Dist: large-image-source-pil>=1.30.7.dev33; extra == "sources"
89
- Requires-Dist: large-image-source-tifffile>=1.30.7.dev33; extra == "sources"
90
- Requires-Dist: large-image-source-gdal>=1.30.7.dev33; extra == "sources"
91
- Requires-Dist: large-image-source-ometiff>=1.30.7.dev33; extra == "sources"
92
- Requires-Dist: large-image-source-test>=1.30.7.dev33; extra == "sources"
93
- Requires-Dist: large-image-source-deepzoom>=1.30.7.dev33; extra == "sources"
94
- Requires-Dist: large-image-source-dicom>=1.30.7.dev33; extra == "sources"
95
- Requires-Dist: large-image-source-tiff>=1.30.7.dev33; extra == "sources"
96
- Requires-Dist: large-image-source-dummy>=1.30.7.dev33; extra == "sources"
83
+ Requires-Dist: large-image-source-openslide>=1.30.7.dev68; extra == "sources"
84
+ Requires-Dist: large-image-source-tifffile>=1.30.7.dev68; extra == "sources"
85
+ Requires-Dist: large-image-source-openjpeg>=1.30.7.dev68; extra == "sources"
86
+ Requires-Dist: large-image-source-tiff>=1.30.7.dev68; extra == "sources"
87
+ Requires-Dist: large-image-source-vips>=1.30.7.dev68; extra == "sources"
88
+ Requires-Dist: large-image-source-deepzoom>=1.30.7.dev68; extra == "sources"
89
+ Requires-Dist: large-image-source-test>=1.30.7.dev68; extra == "sources"
90
+ Requires-Dist: large-image-source-bioformats>=1.30.7.dev68; extra == "sources"
91
+ Requires-Dist: large-image-source-multi>=1.30.7.dev68; extra == "sources"
92
+ Requires-Dist: large-image-source-mapnik>=1.30.7.dev68; extra == "sources"
93
+ Requires-Dist: large-image-source-zarr>=1.30.7.dev68; extra == "sources"
94
+ Requires-Dist: large-image-source-dummy>=1.30.7.dev68; extra == "sources"
95
+ Requires-Dist: large-image-source-pil>=1.30.7.dev68; extra == "sources"
96
+ Requires-Dist: large-image-source-nd2>=1.30.7.dev68; extra == "sources"
97
+ Requires-Dist: large-image-source-gdal>=1.30.7.dev68; extra == "sources"
98
+ Requires-Dist: large-image-source-dicom>=1.30.7.dev68; extra == "sources"
99
+ Requires-Dist: large-image-source-ometiff>=1.30.7.dev68; extra == "sources"
100
+ Requires-Dist: large-image-source-rasterio>=1.30.7.dev68; extra == "sources"
97
101
  Provides-Extra: all
98
- Requires-Dist: large-image-source-rasterio>=1.30.7.dev33; extra == "all"
99
- Requires-Dist: redis>=4.5.5; extra == "all"
100
- Requires-Dist: tol_colors; extra == "all"
101
- Requires-Dist: large-image-source-openslide>=1.30.7.dev33; extra == "all"
102
- Requires-Dist: pyvips; extra == "all"
103
- Requires-Dist: large-image-converter>=1.30.7.dev33; extra == "all"
102
+ Requires-Dist: large-image-source-openslide>=1.30.7.dev68; extra == "all"
103
+ Requires-Dist: large-image-source-openjpeg>=1.30.7.dev68; extra == "all"
104
+ Requires-Dist: large-image-source-tiff>=1.30.7.dev68; extra == "all"
105
+ Requires-Dist: large-image-source-deepzoom>=1.30.7.dev68; extra == "all"
106
+ Requires-Dist: large-image-source-bioformats>=1.30.7.dev68; extra == "all"
107
+ Requires-Dist: large-image-source-multi>=1.30.7.dev68; extra == "all"
104
108
  Requires-Dist: psutil>=4.2.0; extra == "all"
109
+ Requires-Dist: redis>=4.5.5; extra == "all"
110
+ Requires-Dist: large-image-source-zarr>=1.30.7.dev68; extra == "all"
111
+ Requires-Dist: large-image-source-dummy>=1.30.7.dev68; extra == "all"
112
+ Requires-Dist: large-image-source-pil[all]>=1.30.7.dev68; extra == "all"
113
+ Requires-Dist: large-image-source-tiff[all]>=1.30.7.dev68; extra == "all"
105
114
  Requires-Dist: matplotlib; extra == "all"
106
- Requires-Dist: large-image-source-vips>=1.30.7.dev33; extra == "all"
107
- Requires-Dist: large-image-source-rasterio[all]>=1.30.7.dev33; extra == "all"
108
- Requires-Dist: large-image-source-tiff[all]>=1.30.7.dev33; extra == "all"
109
- Requires-Dist: large-image-source-pil>=1.30.7.dev33; extra == "all"
110
- Requires-Dist: large-image-source-pil[all]>=1.30.7.dev33; extra == "all"
111
- Requires-Dist: large-image-source-gdal>=1.30.7.dev33; extra == "all"
112
- Requires-Dist: large-image-source-test>=1.30.7.dev33; extra == "all"
113
- Requires-Dist: large-image-source-deepzoom>=1.30.7.dev33; extra == "all"
114
- Requires-Dist: large-image-source-dicom>=1.30.7.dev33; extra == "all"
115
- Requires-Dist: large-image-source-tiff>=1.30.7.dev33; extra == "all"
116
- Requires-Dist: large-image-source-bioformats>=1.30.7.dev33; extra == "all"
117
- Requires-Dist: large-image-source-openjpeg>=1.30.7.dev33; extra == "all"
118
- Requires-Dist: large-image-source-zarr>=1.30.7.dev33; extra == "all"
119
- Requires-Dist: simplejpeg; extra == "all"
120
- Requires-Dist: large-image-source-mapnik>=1.30.7.dev33; extra == "all"
115
+ Requires-Dist: large-image-source-nd2>=1.30.7.dev68; extra == "all"
116
+ Requires-Dist: large-image-source-gdal>=1.30.7.dev68; extra == "all"
117
+ Requires-Dist: large-image-source-pil>=1.30.7.dev68; extra == "all"
118
+ Requires-Dist: large-image-source-ometiff>=1.30.7.dev68; extra == "all"
119
+ Requires-Dist: large-image-source-vips>=1.30.7.dev68; extra == "all"
120
+ Requires-Dist: large-image-source-rasterio[all]>=1.30.7.dev68; extra == "all"
121
121
  Requires-Dist: pylibmc>=1.5.1; platform_system != "Windows" and extra == "all"
122
- Requires-Dist: large-image-source-multi>=1.30.7.dev33; extra == "all"
123
- Requires-Dist: large-image-source-nd2>=1.30.7.dev33; extra == "all"
124
- Requires-Dist: large-image-source-tifffile>=1.30.7.dev33; extra == "all"
125
- Requires-Dist: large-image-source-multi[all]>=1.30.7.dev33; extra == "all"
126
- Requires-Dist: large-image-source-ometiff>=1.30.7.dev33; extra == "all"
127
- Requires-Dist: large-image-source-dummy>=1.30.7.dev33; extra == "all"
122
+ Requires-Dist: large-image-source-tifffile>=1.30.7.dev68; extra == "all"
123
+ Requires-Dist: pyvips; extra == "all"
124
+ Requires-Dist: large-image-source-test>=1.30.7.dev68; extra == "all"
125
+ Requires-Dist: large-image-source-multi[all]>=1.30.7.dev68; extra == "all"
126
+ Requires-Dist: tol_colors; extra == "all"
127
+ Requires-Dist: large-image-source-mapnik>=1.30.7.dev68; extra == "all"
128
+ Requires-Dist: large-image-converter>=1.30.7.dev68; extra == "all"
129
+ Requires-Dist: aiohttp; extra == "all"
130
+ Requires-Dist: simplejpeg; extra == "all"
131
+ Requires-Dist: ipyvue; extra == "all"
132
+ Requires-Dist: large-image-source-dicom>=1.30.7.dev68; extra == "all"
133
+ Requires-Dist: large-image-source-rasterio>=1.30.7.dev68; extra == "all"
134
+ Requires-Dist: ipyleaflet; extra == "all"
128
135
  Provides-Extra: common
136
+ Requires-Dist: large-image-source-openslide>=1.30.7.dev68; extra == "common"
137
+ Requires-Dist: large-image-source-deepzoom>=1.30.7.dev68; extra == "common"
138
+ Requires-Dist: large-image-source-test>=1.30.7.dev68; extra == "common"
139
+ Requires-Dist: large-image-source-multi>=1.30.7.dev68; extra == "common"
129
140
  Requires-Dist: tol_colors; extra == "common"
130
- Requires-Dist: large-image-source-zarr>=1.30.7.dev33; extra == "common"
131
- Requires-Dist: large-image-source-openslide>=1.30.7.dev33; extra == "common"
132
141
  Requires-Dist: psutil>=4.2.0; extra == "common"
133
- Requires-Dist: matplotlib; extra == "common"
142
+ Requires-Dist: large-image-source-zarr>=1.30.7.dev68; extra == "common"
143
+ Requires-Dist: large-image-source-pil[all]>=1.30.7.dev68; extra == "common"
134
144
  Requires-Dist: simplejpeg; extra == "common"
135
- Requires-Dist: large-image-source-rasterio[all]>=1.30.7.dev33; extra == "common"
136
- Requires-Dist: large-image-source-nd2>=1.30.7.dev33; extra == "common"
137
- Requires-Dist: large-image-source-multi>=1.30.7.dev33; extra == "common"
138
- Requires-Dist: large-image-source-tifffile>=1.30.7.dev33; extra == "common"
139
- Requires-Dist: large-image-source-pil[all]>=1.30.7.dev33; extra == "common"
140
- Requires-Dist: large-image-source-test>=1.30.7.dev33; extra == "common"
141
- Requires-Dist: large-image-source-deepzoom>=1.30.7.dev33; extra == "common"
142
- Requires-Dist: large-image-source-dicom>=1.30.7.dev33; extra == "common"
145
+ Requires-Dist: matplotlib; extra == "common"
146
+ Requires-Dist: large-image-source-nd2>=1.30.7.dev68; extra == "common"
147
+ Requires-Dist: large-image-source-dicom>=1.30.7.dev68; extra == "common"
148
+ Requires-Dist: large-image-source-tifffile>=1.30.7.dev68; extra == "common"
149
+ Requires-Dist: large-image-source-rasterio[all]>=1.30.7.dev68; extra == "common"
143
150
 
144
151
  Large Image
145
152
  ===========
@@ -228,6 +228,10 @@ class TileSource(IPyLeafletMixin):
228
228
  def geospatial(self) -> bool:
229
229
  return False
230
230
 
231
+ @property
232
+ def _unstyled(self) -> 'TileSource':
233
+ return getattr(self, '_unstyledInstance', self)
234
+
231
235
  def _setStyle(self, style: Any) -> None:
232
236
  """
233
237
  Check and set the specified style from a json string or a dictionary.
@@ -304,13 +308,11 @@ class TileSource(IPyLeafletMixin):
304
308
  with self._sourceLock:
305
309
  if not self._dtype:
306
310
  self._dtype = 'check'
307
- sample, _ = cast(Tuple[np.ndarray, Any], getattr(
308
- self, '_unstyledInstance', self).getRegion(
309
- region=dict(left=0, top=0, width=1, height=1),
310
- format=TILE_FORMAT_NUMPY))
311
+ sample, _ = cast(Tuple[np.ndarray, Any], self._unstyled.getRegion(
312
+ region=dict(left=0, top=0, width=1, height=1),
313
+ format=TILE_FORMAT_NUMPY))
311
314
  self._dtype = np.dtype(sample.dtype)
312
- self._bandCount = len(
313
- getattr(getattr(self, '_unstyledInstance', self), '_bandInfo', []))
315
+ self._bandCount = len(getattr(self._unstyled, '_bandInfo', []))
314
316
  if not self._bandCount:
315
317
  self._bandCount = sample.shape[-1] if len(sample.shape) == 3 else 1
316
318
  return cast(np.dtype, self._dtype)
@@ -706,7 +708,7 @@ class TileSource(IPyLeafletMixin):
706
708
  :param onlyMinMax: if True, only find the min and max. If False, get
707
709
  the entire histogram.
708
710
  """
709
- self._bandRanges[frame] = getattr(self, '_unstyledInstance', self).histogram(
711
+ self._bandRanges[frame] = self._unstyled.histogram(
710
712
  dtype=dtype,
711
713
  onlyMinMax=onlyMinMax,
712
714
  output={'maxWidth': min(self.sizeX, analysisSize),
@@ -1043,8 +1045,7 @@ class TileSource(IPyLeafletMixin):
1043
1045
  else:
1044
1046
  frame = entry['frame'] if entry.get('frame') is not None else (
1045
1047
  sc.mainFrame + entry['framedelta'])
1046
- image = getattr(self, '_unstyledInstance', self).getTile(
1047
- x, y, z, frame=frame, numpyAllowed=True)
1048
+ image = self._unstyled.getTile(x, y, z, frame=frame, numpyAllowed=True)
1048
1049
  image = image[:sc.mainImage.shape[0],
1049
1050
  :sc.mainImage.shape[1],
1050
1051
  :sc.mainImage.shape[2]]
@@ -1625,7 +1626,7 @@ class TileSource(IPyLeafletMixin):
1625
1626
  'Compositing tile from higher resolution tiles x=%d y=%d z=%d',
1626
1627
  x * scale + newX, y * scale + newY, z)
1627
1628
  lastlog = time.time()
1628
- subtile = getattr(self, '_unstyledInstance', self).getTile(
1629
+ subtile = self._unstyled.getTile(
1629
1630
  x * scale + newX, y * scale + newY, z,
1630
1631
  pilImageAllowed=False, numpyAllowed='always',
1631
1632
  sparseFallback=True, edge=False, frame=kwargs.get('frame'))
@@ -1649,7 +1650,7 @@ class TileSource(IPyLeafletMixin):
1649
1650
  'Compositing tile from higher resolution tiles x=%d y=%d z=%d',
1650
1651
  x * scale + newX, y * scale + newY, z)
1651
1652
  lastlog = time.time()
1652
- subtile = getattr(self, '_unstyledInstance', self).getTile(
1653
+ subtile = self._unstyled.getTile(
1653
1654
  x * scale + newX, y * scale + newY, z,
1654
1655
  pilImageAllowed=True, numpyAllowed=False,
1655
1656
  sparseFallback=True, edge=False, frame=kwargs.get('frame'))
@@ -14,17 +14,25 @@ Please note that this webserver will not work with Classic Notebook and will
14
14
  likely lead to crashes. This is only for use in JupyterLab.
15
15
 
16
16
  """
17
+ import ast
18
+ import asyncio
17
19
  import importlib.util
18
20
  import json
19
21
  import os
20
- import re
22
+ import threading
21
23
  import weakref
22
24
  from typing import Any, Dict, List, Optional, Tuple, Union, cast
25
+ from urllib.parse import parse_qs, quote, urlencode, urlparse, urlunparse
23
26
 
27
+ import numpy as np
28
+
29
+ import large_image
24
30
  from large_image.exceptions import TileSourceXYZRangeError
25
31
  from large_image.tilesource.utilities import JSONDict
26
32
 
27
33
  ipyleafletPresent = importlib.util.find_spec('ipyleaflet') is not None
34
+ ipyvuePresent = importlib.util.find_spec('ipyvue') is not None
35
+ aiohttpPresent = importlib.util.find_spec('aiohttp') is not None
28
36
 
29
37
 
30
38
  class IPyLeafletMixin:
@@ -83,7 +91,7 @@ class IPyLeafletMixin:
83
91
 
84
92
  def __init__(self, *args, **kwargs) -> None:
85
93
  self._jupyter_server_manager = None
86
- self._map = Map()
94
+ self._map = Map(ts=self)
87
95
  if ipyleafletPresent:
88
96
  self.to_map = self._map.to_map
89
97
  self.from_map = self._map.from_map
@@ -173,6 +181,7 @@ class Map:
173
181
  on the girder client.
174
182
  """
175
183
  self._layer = self._map = self._metadata = self._frame_slider = None
184
+ self._frame_histograms: Optional[Dict[int, Any]] = None
176
185
  self._ts = ts
177
186
  if (not url or not metadata) and gc and (id or resource):
178
187
  fileId = None
@@ -270,7 +279,7 @@ class Map:
270
279
  ipyleaflet layer, and the center of the tile source.
271
280
  """
272
281
  from ipyleaflet import Map, basemaps, projections
273
- from ipywidgets import IntSlider, VBox
282
+ from ipywidgets import VBox
274
283
 
275
284
  try:
276
285
  default_zoom = metadata['levels'] - metadata['sourceLevels']
@@ -311,16 +320,14 @@ class Map:
311
320
 
312
321
  children: List[Any] = []
313
322
  frames = metadata.get('frames')
314
- if frames is not None:
315
- self._frame_slider = IntSlider(
316
- value=0,
317
- min=0,
318
- max=len(frames) - 1,
319
- description='Frame:',
320
- )
321
- if self._frame_slider:
322
- self._frame_slider.observe(self.update_frame, names='value')
323
- children.append(self._frame_slider)
323
+ if frames is not None and ipyvuePresent and aiohttpPresent:
324
+ from large_image.widgets.components import FrameSelector
325
+
326
+ self.frame_selector = FrameSelector()
327
+ self.frame_selector.imageMetadata = metadata
328
+ self.frame_selector.updateFrameCallback = self.update_frame
329
+ self.frame_selector.getFrameHistogram = self.get_frame_histogram
330
+ children.append(self.frame_selector)
324
331
 
325
332
  m = Map(
326
333
  crs=crs,
@@ -333,6 +340,7 @@ class Map:
333
340
  dragging=True,
334
341
  attribution_control=False,
335
342
  )
343
+ m.layout.height = '50vh'
336
344
  if self._geospatial:
337
345
  m.add_layer(layer)
338
346
  self._map = m
@@ -393,19 +401,70 @@ class Map:
393
401
  return transf.transform(x, y)
394
402
  return x, self._metadata['sizeY'] - y
395
403
 
396
- def update_frame(self, event, **kwargs):
397
- frame = int(event.get('new'))
404
+ def update_frame(self, frame, style, **kwargs):
398
405
  if self._layer:
399
- if 'frame=' in self._layer.url:
400
- self._layer.url = re.sub(r'frame=(\d+)', f'frame={frame}', self._layer.url)
401
- else:
402
- if '?' in self._layer.url:
403
- self._layer.url = self._layer.url.replace('?', f'?frame={frame}&')
404
- else:
405
- self._layer.url += f'?frame={frame}'
406
-
406
+ parsed_url = urlparse(self._layer.url)
407
+ query = parsed_url.query
408
+ query = {k: v[0] for k, v in parse_qs(query).items()}
409
+ query.update(dict(
410
+ frame=frame,
411
+ style=json.dumps(style),
412
+ ))
413
+ query_string = urlencode(query, quote_via=quote, safe='{}')
414
+ self._layer.url = urlunparse((
415
+ parsed_url.scheme, parsed_url.netloc,
416
+ parsed_url.path, parsed_url.params,
417
+ query_string, parsed_url.fragment,
418
+ ))
407
419
  self._layer.redraw()
408
420
 
421
+ def get_frame_histogram(self, query):
422
+ import aiohttp
423
+
424
+ if self._layer is not None:
425
+ if self._frame_histograms is None:
426
+ self._frame_histograms = {}
427
+
428
+ frame = query.get('frame')
429
+ parsed_url = urlparse(self._layer.url)
430
+ query_string = urlencode(query)
431
+ scheme = parsed_url.scheme or 'http'
432
+ netloc = parsed_url.netloc
433
+ if not netloc and self._ts is not None:
434
+ netloc = f'{self._ts.JUPYTER_HOST}:{self._ts._jupyter_server_manager.port}'
435
+ histogram_url = urlunparse((
436
+ scheme, netloc,
437
+ '/histogram', parsed_url.params,
438
+ query_string, parsed_url.fragment,
439
+ ))
440
+
441
+ async def fetch(url):
442
+ async with aiohttp.ClientSession(
443
+ timeout=aiohttp.ClientTimeout(total=900),
444
+ ) as session:
445
+ async with session.get(url) as response:
446
+ self._frame_histograms[frame] = await response.json() # type: ignore
447
+ # rewrite whole object for watcher
448
+ self.frame_selector.frameHistograms = (
449
+ self._frame_histograms.copy() # type: ignore
450
+ )
451
+
452
+ asyncio.ensure_future(fetch(histogram_url))
453
+
454
+
455
+ # used for encoding histogram data
456
+ class NumpyEncoder(json.JSONEncoder):
457
+ """Special json encoder for numpy types from https://stackoverflow.com/a/49677241"""
458
+
459
+ def default(self, obj):
460
+ if isinstance(obj, np.integer):
461
+ return int(obj)
462
+ if isinstance(obj, np.floating):
463
+ return float(obj)
464
+ if isinstance(obj, np.ndarray):
465
+ return obj.tolist()
466
+ return json.JSONEncoder.default(self, obj)
467
+
409
468
 
410
469
  def launch_tile_server(tile_source: IPyLeafletMixin, port: int = 0) -> Any:
411
470
  import tornado.httpserver
@@ -443,6 +502,26 @@ def launch_tile_server(tile_source: IPyLeafletMixin, port: int = 0) -> Any:
443
502
  self.write(json.dumps(manager.tile_source.metadata)) # type: ignore[attr-defined]
444
503
  self.set_header('Content-Type', 'application/json')
445
504
 
505
+ class TileSourceHistogramHandler(tornado.web.RequestHandler):
506
+ """REST endpoint to get image metadata."""
507
+
508
+ async def get(self) -> None:
509
+ kwargs = {k: ast.literal_eval(self.get_argument(k)) for k in self.request.arguments}
510
+
511
+ def fetch():
512
+ if not hasattr(manager, '_histogram_semaphore'):
513
+ manager._histogram_semaphore = threading.Semaphore( # type: ignore
514
+ min(6, large_image.config.cpu_count()),
515
+ )
516
+ with manager._histogram_semaphore: # type: ignore[attr-defined]
517
+ histogram = manager.tile_source._unstyled.histogram( # type: ignore
518
+ **kwargs,
519
+ ).get('histogram', [{}])
520
+ self.write(json.dumps(histogram, cls=NumpyEncoder))
521
+ self.set_header('Content-Type', 'application/json')
522
+
523
+ await tornado.ioloop.IOLoop.current().run_in_executor(None, fetch)
524
+
446
525
  class TileSourceTileHandler(tornado.web.RequestHandler):
447
526
  """REST endpoint to serve tiles from image in slippy maps standard."""
448
527
 
@@ -451,6 +530,9 @@ def launch_tile_server(tile_source: IPyLeafletMixin, port: int = 0) -> Any:
451
530
  y = int(self.get_argument('y'))
452
531
  z = int(self.get_argument('z'))
453
532
  frame = int(self.get_argument('frame', default='0'))
533
+ style = self.get_argument('style', default=None)
534
+ if style:
535
+ manager.tile_source.style = json.loads(style) # type: ignore[attr-defined]
454
536
  encoding = self.get_argument('encoding', 'PNG')
455
537
  try:
456
538
  tile_binary = manager.tile_source.getTile( # type: ignore[attr-defined]
@@ -465,6 +547,7 @@ def launch_tile_server(tile_source: IPyLeafletMixin, port: int = 0) -> Any:
465
547
 
466
548
  app = tornado.web.Application([
467
549
  (r'/metadata', TileSourceMetadataHandler),
550
+ (r'/histogram', TileSourceHistogramHandler),
468
551
  (r'/tile', TileSourceTileHandler),
469
552
  ])
470
553
  sockets = tornado.netutil.bind_sockets(port, '')