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.
- {large_image-1.30.7.dev33/large_image.egg-info → large_image-1.30.7.dev68}/PKG-INFO +83 -76
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/tilesource/base.py +12 -11
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/tilesource/jupyter.py +106 -23
- large_image-1.30.7.dev68/large_image/widgets/CompositeLayers.vue +618 -0
- large_image-1.30.7.dev68/large_image/widgets/DualInput.vue +127 -0
- large_image-1.30.7.dev68/large_image/widgets/FrameSelector.vue +434 -0
- large_image-1.30.7.dev68/large_image/widgets/HistogramEditor.vue +455 -0
- large_image-1.30.7.dev68/large_image/widgets/colors.json +77 -0
- large_image-1.30.7.dev68/large_image/widgets/components.py +38 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68/large_image.egg-info}/PKG-INFO +83 -76
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image.egg-info/SOURCES.txt +7 -1
- large_image-1.30.7.dev68/large_image.egg-info/requires.txt +159 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/setup.py +1 -0
- large_image-1.30.7.dev33/large_image.egg-info/requires.txt +0 -151
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/LICENSE +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/NOTICE +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/README.rst +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/annotations.rst +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/api_index.rst +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/caching.rst +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/conf.py +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/config_options.rst +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/development.rst +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/dicomweb_assetstore.rst +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/format_examples_datastore.py +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/formats.rst +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/generate_format_table.py +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/getting_started.rst +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/girder_annotation_config_options.rst +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/girder_caching.rst +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/girder_config_options.rst +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/girder_index.rst +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/image_conversion.rst +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/index.rst +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/make_docs.sh +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/multi_source_specification.rst +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/notebooks/large_image_examples.ipynb +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/notebooks/zarr_sink_example.ipynb +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/notebooks.rst +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/plottable.rst +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/static/K.png +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/static/custom.css +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/tilesource_options.rst +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/docs/upgrade.rst +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/__init__.py +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/cache_util/__init__.py +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/cache_util/base.py +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/cache_util/cache.py +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/cache_util/cachefactory.py +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/cache_util/memcache.py +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/cache_util/rediscache.py +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/config.py +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/constants.py +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/exceptions.py +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/tilesource/__init__.py +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/tilesource/geo.py +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/tilesource/resample.py +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/tilesource/stylefuncs.py +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/tilesource/tiledict.py +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/tilesource/tileiterator.py +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image/tilesource/utilities.py +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image.egg-info/dependency_links.txt +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image.egg-info/not-zip-safe +0 -0
- {large_image-1.30.7.dev33 → large_image-1.30.7.dev68}/large_image.egg-info/top_level.txt +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
81
|
+
Requires-Dist: large-image-source-zarr>=1.30.7.dev68; extra == "zarr"
|
|
78
82
|
Provides-Extra: sources
|
|
79
|
-
Requires-Dist: large-image-source-
|
|
80
|
-
Requires-Dist: large-image-source-
|
|
81
|
-
Requires-Dist: large-image-source-openjpeg>=1.30.7.
|
|
82
|
-
Requires-Dist: large-image-source-
|
|
83
|
-
Requires-Dist: large-image-source-
|
|
84
|
-
Requires-Dist: large-image-source-
|
|
85
|
-
Requires-Dist: large-image-source-
|
|
86
|
-
Requires-Dist: large-image-source-
|
|
87
|
-
Requires-Dist: large-image-source-
|
|
88
|
-
Requires-Dist: large-image-source-
|
|
89
|
-
Requires-Dist: large-image-source-
|
|
90
|
-
Requires-Dist: large-image-source-
|
|
91
|
-
Requires-Dist: large-image-source-
|
|
92
|
-
Requires-Dist: large-image-source-
|
|
93
|
-
Requires-Dist: large-image-source-
|
|
94
|
-
Requires-Dist: large-image-source-dicom>=1.30.7.
|
|
95
|
-
Requires-Dist: large-image-source-
|
|
96
|
-
Requires-Dist: large-image-source-
|
|
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-
|
|
99
|
-
Requires-Dist:
|
|
100
|
-
Requires-Dist:
|
|
101
|
-
Requires-Dist: large-image-source-
|
|
102
|
-
Requires-Dist:
|
|
103
|
-
Requires-Dist: large-image-
|
|
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-
|
|
107
|
-
Requires-Dist: large-image-source-
|
|
108
|
-
Requires-Dist: large-image-source-
|
|
109
|
-
Requires-Dist: large-image-source-
|
|
110
|
-
Requires-Dist: large-image-source-
|
|
111
|
-
Requires-Dist: large-image-source-
|
|
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-
|
|
123
|
-
Requires-Dist:
|
|
124
|
-
Requires-Dist: large-image-source-
|
|
125
|
-
Requires-Dist: large-image-source-multi[all]>=1.30.7.
|
|
126
|
-
Requires-Dist:
|
|
127
|
-
Requires-Dist: large-image-source-
|
|
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:
|
|
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:
|
|
136
|
-
Requires-Dist: large-image-source-nd2>=1.30.7.
|
|
137
|
-
Requires-Dist: large-image-source-
|
|
138
|
-
Requires-Dist: large-image-source-tifffile>=1.30.7.
|
|
139
|
-
Requires-Dist: large-image-source-
|
|
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],
|
|
308
|
-
|
|
309
|
-
|
|
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] =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
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,
|
|
397
|
-
frame = int(event.get('new'))
|
|
404
|
+
def update_frame(self, frame, style, **kwargs):
|
|
398
405
|
if self._layer:
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
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, '')
|