large-image 1.30.2.dev10__tar.gz → 1.30.2.dev42__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 (59) hide show
  1. {large_image-1.30.2.dev10/large_image.egg-info → large_image-1.30.2.dev42}/PKG-INFO +76 -76
  2. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/getting_started.rst +53 -6
  3. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/notebooks/zarr_sink_example.ipynb +62 -29
  4. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/tilesource/base.py +53 -0
  5. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42/large_image.egg-info}/PKG-INFO +76 -76
  6. large_image-1.30.2.dev42/large_image.egg-info/requires.txt +151 -0
  7. large_image-1.30.2.dev10/large_image.egg-info/requires.txt +0 -151
  8. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/LICENSE +0 -0
  9. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/NOTICE +0 -0
  10. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/README.rst +0 -0
  11. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/annotations.rst +0 -0
  12. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/api_index.rst +0 -0
  13. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/caching.rst +0 -0
  14. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/conf.py +0 -0
  15. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/config_options.rst +0 -0
  16. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/development.rst +0 -0
  17. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/dicomweb_assetstore.rst +0 -0
  18. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/format_examples_datastore.py +0 -0
  19. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/formats.rst +0 -0
  20. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/generate_format_table.py +0 -0
  21. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/girder_annotation_config_options.rst +0 -0
  22. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/girder_caching.rst +0 -0
  23. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/girder_config_options.rst +0 -0
  24. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/girder_index.rst +0 -0
  25. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/image_conversion.rst +0 -0
  26. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/index.rst +0 -0
  27. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/make_docs.sh +0 -0
  28. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/multi_source_specification.rst +0 -0
  29. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/notebooks/large_image_examples.ipynb +0 -0
  30. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/notebooks.rst +0 -0
  31. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/plottable.rst +0 -0
  32. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/static/K.png +0 -0
  33. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/static/custom.css +0 -0
  34. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/tilesource_options.rst +0 -0
  35. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/docs/upgrade.rst +0 -0
  36. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/__init__.py +0 -0
  37. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/cache_util/__init__.py +0 -0
  38. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/cache_util/base.py +0 -0
  39. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/cache_util/cache.py +0 -0
  40. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/cache_util/cachefactory.py +0 -0
  41. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/cache_util/memcache.py +0 -0
  42. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/cache_util/rediscache.py +0 -0
  43. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/config.py +0 -0
  44. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/constants.py +0 -0
  45. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/exceptions.py +0 -0
  46. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/tilesource/__init__.py +0 -0
  47. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/tilesource/geo.py +0 -0
  48. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/tilesource/jupyter.py +0 -0
  49. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/tilesource/resample.py +0 -0
  50. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/tilesource/stylefuncs.py +0 -0
  51. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/tilesource/tiledict.py +0 -0
  52. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/tilesource/tileiterator.py +0 -0
  53. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image/tilesource/utilities.py +0 -0
  54. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image.egg-info/SOURCES.txt +0 -0
  55. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image.egg-info/dependency_links.txt +0 -0
  56. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image.egg-info/not-zip-safe +0 -0
  57. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/large_image.egg-info/top_level.txt +0 -0
  58. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/setup.cfg +0 -0
  59. {large_image-1.30.2.dev10 → large_image-1.30.2.dev42}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: large-image
3
- Version: 1.30.2.dev10
3
+ Version: 1.30.2.dev42
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,7 +30,7 @@ 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.2.dev10; extra == "converter"
33
+ Requires-Dist: large-image-converter>=1.30.2.dev42; extra == "converter"
34
34
  Provides-Extra: colormaps
35
35
  Requires-Dist: matplotlib; extra == "colormaps"
36
36
  Provides-Extra: tiledoutput
@@ -39,105 +39,105 @@ Provides-Extra: performance
39
39
  Requires-Dist: psutil>=4.2.0; extra == "performance"
40
40
  Requires-Dist: simplejpeg; extra == "performance"
41
41
  Provides-Extra: bioformats
42
- Requires-Dist: large-image-source-bioformats>=1.30.2.dev10; extra == "bioformats"
42
+ Requires-Dist: large-image-source-bioformats>=1.30.2.dev42; extra == "bioformats"
43
43
  Provides-Extra: deepzoom
44
- Requires-Dist: large-image-source-deepzoom>=1.30.2.dev10; extra == "deepzoom"
44
+ Requires-Dist: large-image-source-deepzoom>=1.30.2.dev42; extra == "deepzoom"
45
45
  Provides-Extra: dicom
46
- Requires-Dist: large-image-source-dicom>=1.30.2.dev10; extra == "dicom"
46
+ Requires-Dist: large-image-source-dicom>=1.30.2.dev42; extra == "dicom"
47
47
  Provides-Extra: dummy
48
- Requires-Dist: large-image-source-dummy>=1.30.2.dev10; extra == "dummy"
48
+ Requires-Dist: large-image-source-dummy>=1.30.2.dev42; extra == "dummy"
49
49
  Provides-Extra: gdal
50
- Requires-Dist: large-image-source-gdal>=1.30.2.dev10; extra == "gdal"
50
+ Requires-Dist: large-image-source-gdal>=1.30.2.dev42; extra == "gdal"
51
51
  Provides-Extra: mapnik
52
- Requires-Dist: large-image-source-mapnik>=1.30.2.dev10; extra == "mapnik"
52
+ Requires-Dist: large-image-source-mapnik>=1.30.2.dev42; extra == "mapnik"
53
53
  Provides-Extra: multi
54
- Requires-Dist: large-image-source-multi>=1.30.2.dev10; extra == "multi"
54
+ Requires-Dist: large-image-source-multi>=1.30.2.dev42; extra == "multi"
55
55
  Provides-Extra: nd2
56
- Requires-Dist: large-image-source-nd2>=1.30.2.dev10; extra == "nd2"
56
+ Requires-Dist: large-image-source-nd2>=1.30.2.dev42; extra == "nd2"
57
57
  Provides-Extra: ometiff
58
- Requires-Dist: large-image-source-ometiff>=1.30.2.dev10; extra == "ometiff"
58
+ Requires-Dist: large-image-source-ometiff>=1.30.2.dev42; extra == "ometiff"
59
59
  Provides-Extra: openjpeg
60
- Requires-Dist: large-image-source-openjpeg>=1.30.2.dev10; extra == "openjpeg"
60
+ Requires-Dist: large-image-source-openjpeg>=1.30.2.dev42; extra == "openjpeg"
61
61
  Provides-Extra: openslide
62
- Requires-Dist: large-image-source-openslide>=1.30.2.dev10; extra == "openslide"
62
+ Requires-Dist: large-image-source-openslide>=1.30.2.dev42; extra == "openslide"
63
63
  Provides-Extra: pil
64
- Requires-Dist: large-image-source-pil>=1.30.2.dev10; extra == "pil"
64
+ Requires-Dist: large-image-source-pil>=1.30.2.dev42; extra == "pil"
65
65
  Provides-Extra: rasterio
66
- Requires-Dist: large-image-source-rasterio>=1.30.2.dev10; extra == "rasterio"
66
+ Requires-Dist: large-image-source-rasterio>=1.30.2.dev42; extra == "rasterio"
67
67
  Provides-Extra: test
68
- Requires-Dist: large-image-source-test>=1.30.2.dev10; extra == "test"
68
+ Requires-Dist: large-image-source-test>=1.30.2.dev42; extra == "test"
69
69
  Provides-Extra: tiff
70
- Requires-Dist: large-image-source-tiff>=1.30.2.dev10; extra == "tiff"
70
+ Requires-Dist: large-image-source-tiff>=1.30.2.dev42; extra == "tiff"
71
71
  Provides-Extra: tifffile
72
- Requires-Dist: large-image-source-tifffile>=1.30.2.dev10; extra == "tifffile"
72
+ Requires-Dist: large-image-source-tifffile>=1.30.2.dev42; extra == "tifffile"
73
73
  Provides-Extra: vips
74
- Requires-Dist: large-image-source-vips>=1.30.2.dev10; extra == "vips"
74
+ Requires-Dist: large-image-source-vips>=1.30.2.dev42; extra == "vips"
75
75
  Provides-Extra: zarr
76
- Requires-Dist: large-image-source-zarr>=1.30.2.dev10; extra == "zarr"
76
+ Requires-Dist: large-image-source-zarr>=1.30.2.dev42; extra == "zarr"
77
77
  Provides-Extra: sources
78
- Requires-Dist: large-image-source-test>=1.30.2.dev10; extra == "sources"
79
- Requires-Dist: large-image-source-bioformats>=1.30.2.dev10; extra == "sources"
80
- Requires-Dist: large-image-source-multi>=1.30.2.dev10; extra == "sources"
81
- Requires-Dist: large-image-source-tifffile>=1.30.2.dev10; extra == "sources"
82
- Requires-Dist: large-image-source-rasterio>=1.30.2.dev10; extra == "sources"
83
- Requires-Dist: large-image-source-deepzoom>=1.30.2.dev10; extra == "sources"
84
- Requires-Dist: large-image-source-ometiff>=1.30.2.dev10; extra == "sources"
85
- Requires-Dist: large-image-source-dummy>=1.30.2.dev10; extra == "sources"
86
- Requires-Dist: large-image-source-zarr>=1.30.2.dev10; extra == "sources"
87
- Requires-Dist: large-image-source-openslide>=1.30.2.dev10; extra == "sources"
88
- Requires-Dist: large-image-source-tiff>=1.30.2.dev10; extra == "sources"
89
- Requires-Dist: large-image-source-nd2>=1.30.2.dev10; extra == "sources"
90
- Requires-Dist: large-image-source-openjpeg>=1.30.2.dev10; extra == "sources"
91
- Requires-Dist: large-image-source-pil>=1.30.2.dev10; extra == "sources"
92
- Requires-Dist: large-image-source-vips>=1.30.2.dev10; extra == "sources"
93
- Requires-Dist: large-image-source-mapnik>=1.30.2.dev10; extra == "sources"
94
- Requires-Dist: large-image-source-dicom>=1.30.2.dev10; extra == "sources"
95
- Requires-Dist: large-image-source-gdal>=1.30.2.dev10; extra == "sources"
78
+ Requires-Dist: large-image-source-tifffile>=1.30.2.dev42; extra == "sources"
79
+ Requires-Dist: large-image-source-openjpeg>=1.30.2.dev42; extra == "sources"
80
+ Requires-Dist: large-image-source-test>=1.30.2.dev42; extra == "sources"
81
+ Requires-Dist: large-image-source-nd2>=1.30.2.dev42; extra == "sources"
82
+ Requires-Dist: large-image-source-tiff>=1.30.2.dev42; extra == "sources"
83
+ Requires-Dist: large-image-source-multi>=1.30.2.dev42; extra == "sources"
84
+ Requires-Dist: large-image-source-bioformats>=1.30.2.dev42; extra == "sources"
85
+ Requires-Dist: large-image-source-pil>=1.30.2.dev42; extra == "sources"
86
+ Requires-Dist: large-image-source-zarr>=1.30.2.dev42; extra == "sources"
87
+ Requires-Dist: large-image-source-dicom>=1.30.2.dev42; extra == "sources"
88
+ Requires-Dist: large-image-source-mapnik>=1.30.2.dev42; extra == "sources"
89
+ Requires-Dist: large-image-source-vips>=1.30.2.dev42; extra == "sources"
90
+ Requires-Dist: large-image-source-dummy>=1.30.2.dev42; extra == "sources"
91
+ Requires-Dist: large-image-source-rasterio>=1.30.2.dev42; extra == "sources"
92
+ Requires-Dist: large-image-source-deepzoom>=1.30.2.dev42; extra == "sources"
93
+ Requires-Dist: large-image-source-ometiff>=1.30.2.dev42; extra == "sources"
94
+ Requires-Dist: large-image-source-openslide>=1.30.2.dev42; extra == "sources"
95
+ Requires-Dist: large-image-source-gdal>=1.30.2.dev42; extra == "sources"
96
96
  Provides-Extra: all
97
- Requires-Dist: large-image-source-bioformats>=1.30.2.dev10; extra == "all"
98
- Requires-Dist: simplejpeg; extra == "all"
99
- Requires-Dist: large-image-source-multi>=1.30.2.dev10; extra == "all"
100
- Requires-Dist: large-image-source-multi[all]>=1.30.2.dev10; extra == "all"
101
- Requires-Dist: large-image-source-deepzoom>=1.30.2.dev10; extra == "all"
102
- Requires-Dist: large-image-converter>=1.30.2.dev10; extra == "all"
103
- Requires-Dist: matplotlib; extra == "all"
104
- Requires-Dist: large-image-source-openslide>=1.30.2.dev10; extra == "all"
105
- Requires-Dist: large-image-source-pil>=1.30.2.dev10; extra == "all"
106
- Requires-Dist: redis>=4.5.5; extra == "all"
107
- Requires-Dist: large-image-source-tifffile>=1.30.2.dev10; extra == "all"
108
- Requires-Dist: large-image-source-dicom>=1.30.2.dev10; extra == "all"
109
- Requires-Dist: large-image-source-rasterio>=1.30.2.dev10; extra == "all"
110
- Requires-Dist: large-image-source-test>=1.30.2.dev10; extra == "all"
111
- Requires-Dist: large-image-source-pil[all]>=1.30.2.dev10; extra == "all"
112
- Requires-Dist: large-image-source-tiff[all]>=1.30.2.dev10; extra == "all"
97
+ Requires-Dist: large-image-source-tifffile>=1.30.2.dev42; extra == "all"
98
+ Requires-Dist: large-image-source-openjpeg>=1.30.2.dev42; extra == "all"
99
+ Requires-Dist: large-image-source-tiff[all]>=1.30.2.dev42; extra == "all"
100
+ Requires-Dist: large-image-source-nd2>=1.30.2.dev42; extra == "all"
101
+ Requires-Dist: pylibmc>=1.5.1; platform_system != "Windows" and extra == "all"
102
+ Requires-Dist: large-image-source-multi>=1.30.2.dev42; extra == "all"
103
+ Requires-Dist: large-image-source-bioformats>=1.30.2.dev42; extra == "all"
104
+ Requires-Dist: large-image-source-pil>=1.30.2.dev42; extra == "all"
105
+ Requires-Dist: large-image-source-zarr>=1.30.2.dev42; extra == "all"
106
+ Requires-Dist: large-image-source-mapnik>=1.30.2.dev42; extra == "all"
107
+ Requires-Dist: large-image-source-rasterio[all]>=1.30.2.dev42; extra == "all"
113
108
  Requires-Dist: psutil>=4.2.0; extra == "all"
114
- Requires-Dist: large-image-source-ometiff>=1.30.2.dev10; extra == "all"
115
- Requires-Dist: large-image-source-dummy>=1.30.2.dev10; extra == "all"
109
+ Requires-Dist: large-image-source-dummy>=1.30.2.dev42; extra == "all"
110
+ Requires-Dist: large-image-source-test>=1.30.2.dev42; extra == "all"
111
+ Requires-Dist: large-image-source-deepzoom>=1.30.2.dev42; extra == "all"
112
+ Requires-Dist: large-image-source-rasterio>=1.30.2.dev42; extra == "all"
113
+ Requires-Dist: large-image-converter>=1.30.2.dev42; extra == "all"
114
+ Requires-Dist: large-image-source-ometiff>=1.30.2.dev42; extra == "all"
115
+ Requires-Dist: large-image-source-openslide>=1.30.2.dev42; extra == "all"
116
+ Requires-Dist: large-image-source-multi[all]>=1.30.2.dev42; extra == "all"
117
+ Requires-Dist: redis>=4.5.5; extra == "all"
118
+ Requires-Dist: large-image-source-pil[all]>=1.30.2.dev42; extra == "all"
119
+ Requires-Dist: large-image-source-tiff>=1.30.2.dev42; extra == "all"
116
120
  Requires-Dist: pyvips; extra == "all"
117
- Requires-Dist: large-image-source-zarr>=1.30.2.dev10; extra == "all"
118
- Requires-Dist: large-image-source-tiff>=1.30.2.dev10; extra == "all"
119
- Requires-Dist: large-image-source-nd2>=1.30.2.dev10; extra == "all"
120
- Requires-Dist: pylibmc>=1.5.1; platform_system != "Windows" and extra == "all"
121
- Requires-Dist: large-image-source-openjpeg>=1.30.2.dev10; extra == "all"
122
- Requires-Dist: large-image-source-vips>=1.30.2.dev10; extra == "all"
123
- Requires-Dist: large-image-source-mapnik>=1.30.2.dev10; extra == "all"
124
- Requires-Dist: large-image-source-rasterio[all]>=1.30.2.dev10; extra == "all"
125
- Requires-Dist: large-image-source-gdal>=1.30.2.dev10; extra == "all"
121
+ Requires-Dist: large-image-source-dicom>=1.30.2.dev42; extra == "all"
122
+ Requires-Dist: simplejpeg; extra == "all"
123
+ Requires-Dist: matplotlib; extra == "all"
124
+ Requires-Dist: large-image-source-vips>=1.30.2.dev42; extra == "all"
125
+ Requires-Dist: large-image-source-gdal>=1.30.2.dev42; extra == "all"
126
126
  Provides-Extra: common
127
- Requires-Dist: large-image-source-test>=1.30.2.dev10; extra == "common"
128
- Requires-Dist: large-image-source-pil[all]>=1.30.2.dev10; extra == "common"
129
- Requires-Dist: large-image-source-multi>=1.30.2.dev10; extra == "common"
127
+ Requires-Dist: redis>=4.5.5; extra == "common"
128
+ Requires-Dist: pylibmc>=1.5.1; platform_system != "Windows" and extra == "common"
129
+ Requires-Dist: large-image-source-nd2>=1.30.2.dev42; extra == "common"
130
+ Requires-Dist: large-image-source-pil[all]>=1.30.2.dev42; extra == "common"
131
+ Requires-Dist: large-image-source-multi>=1.30.2.dev42; extra == "common"
132
+ Requires-Dist: large-image-source-zarr>=1.30.2.dev42; extra == "common"
133
+ Requires-Dist: large-image-source-dicom>=1.30.2.dev42; extra == "common"
130
134
  Requires-Dist: simplejpeg; extra == "common"
131
- Requires-Dist: large-image-source-deepzoom>=1.30.2.dev10; extra == "common"
132
135
  Requires-Dist: psutil>=4.2.0; extra == "common"
133
- Requires-Dist: large-image-source-zarr>=1.30.2.dev10; extra == "common"
136
+ Requires-Dist: large-image-source-test>=1.30.2.dev42; extra == "common"
134
137
  Requires-Dist: matplotlib; extra == "common"
135
- Requires-Dist: redis>=4.5.5; extra == "common"
136
- Requires-Dist: large-image-source-nd2>=1.30.2.dev10; extra == "common"
137
- Requires-Dist: pylibmc>=1.5.1; platform_system != "Windows" and extra == "common"
138
- Requires-Dist: large-image-source-rasterio[all]>=1.30.2.dev10; extra == "common"
139
- Requires-Dist: large-image-source-tifffile>=1.30.2.dev10; extra == "common"
140
- Requires-Dist: large-image-source-dicom>=1.30.2.dev10; extra == "common"
138
+ Requires-Dist: large-image-source-deepzoom>=1.30.2.dev42; extra == "common"
139
+ Requires-Dist: large-image-source-rasterio[all]>=1.30.2.dev42; extra == "common"
140
+ Requires-Dist: large-image-source-tifffile>=1.30.2.dev42; extra == "common"
141
141
 
142
142
  Large Image
143
143
  ===========
@@ -334,25 +334,60 @@ You can also composite a multi-frame image into a false-color output:
334
334
  Writing an Image
335
335
  ----------------
336
336
 
337
- If you wish to visualize numpy data, large_image can write a tiled tiff. This requires a tile source that supports writing to be installed. As of this writing, the ``large-image-source-zarr`` and ``large-image-source-vips`` sources supports this. If both are installed, the ``large-image-source-zarr`` is the default.
337
+ If you wish to visualize numpy data, ``large_image`` can write a tiled image.
338
+ This requires a tile source that supports writing to be installed.
339
+ As of this writing, the ``large-image-source-zarr`` and ``large-image-source-vips`` sources both support this.
340
+ If both are installed, the ``large-image-source-zarr`` is the default.
341
+ Some of the API options available for ``large-image-source-zarr`` are not available for ``large-image-source-vips``.
338
342
 
339
343
  .. code-block:: python
340
344
 
341
345
  import large_image
346
+
342
347
  source = large_image.new()
343
348
  for nparray, x, y in fancy_algorithm():
344
349
  # We could optionally add a mask to limit the output
345
350
  source.addTile(nparray, x, y)
346
351
  source.write('/tmp/sample.tiff', lossy=False)
347
352
 
348
- The ``large-image-source-zarr`` can be used to store multiple frame data with arbitrary axes.
353
+ Multiple Frames
354
+ ~~~~~~~~~~~~~~~
355
+
356
+ ``large-image-source-zarr`` can be used to store multiframe data with arbitrary axes.
357
+ The example below demonstrates the creation of an image with five axes: T, Z, Y, X, S.
349
358
 
350
359
  .. code-block:: python
351
360
 
352
361
  import large_image
362
+
363
+ time_values = [0.5, 1.5, 2.5, 3.5]
364
+ z_values = [3, 6, 9]
365
+ tile_pos_values = [0, 1024, 2048, 3072, 4096]
366
+
353
367
  source = large_image.new()
354
- for nparray, x, y, time, param1 in fancy_algorithm():
355
- source.addTile(nparray, x, y, time=time, p1=param1)
368
+ for t_index, t_value in enumerate(time_values):
369
+ for z_index, z_value in enumerate(z_values):
370
+ for y_value in tile_pos_values:
371
+ for x_value in tile_pos_values:
372
+
373
+ # tile is a numpy array with shape (1024, 1024, 3)
374
+ # this shape corresponds to the following axes, respectively: (Y, X, S)
375
+ tile = get_my_data_tile(x_value, y_value, z_value, t_value)
376
+
377
+ source.addTile(
378
+ tile,
379
+ x_value,
380
+ y_value,
381
+ z=z_index,
382
+ time=t_index,
383
+
384
+ # z_value and t_value are optional parameters to store the
385
+ # true values at the provided z index and t index
386
+ z_value=z_value,
387
+ time_value=t_value,
388
+ )
389
+ source.frameUnits = dict(t='ms', z='cm')
390
+
356
391
  # The writer supports a variety of formats
357
392
  source.write('/tmp/sample.zarr.zip', lossy=False)
358
393
 
@@ -361,31 +396,37 @@ You may also choose to read tiles from one source and write modified tiles to a
361
396
  .. code-block:: python
362
397
 
363
398
  import large_image
399
+
364
400
  original_source = large_image.open('path/to/original/image.tiff')
365
401
  new_source = large_image.new()
366
402
  for frame in original_source.getMetadata().get('frames', []):
367
403
  for tile in original_source.tileIterator(frame=frame['Frame'], format='numpy'):
368
- t, x, y = tile['tile'], tile['x'], tile['y']
404
+ tile_data, x, y = tile['tile'], tile['x'], tile['y']
369
405
  kwargs = {
370
406
  'z': frame['IndexZ'],
371
407
  'c': frame['IndexC'],
372
408
  }
373
- modified_tile = modify_tile(t)
409
+ modified_tile = modify_tile(tile_data)
374
410
  new_source.addTile(modified_tile, x=x, y=y, **kwargs)
375
411
  new_source.write('path/to/new/image.tiff', lossy=False)
376
412
 
413
+ Multiple processes
414
+ ~~~~~~~~~~~~~~~~~~
415
+
377
416
  In some cases, it may be beneficial to write to a single image from multiple processes or threads:
378
417
 
379
418
  .. code-block:: python
380
419
 
381
420
  import large_image
382
421
  import multiprocessing
422
+
383
423
  # Important: Must be a pickleable function
384
424
  def add_tile_to_source(tilesource, nparray, position):
385
425
  tilesource.addTile(
386
426
  nparray,
387
427
  **position
388
428
  )
429
+
389
430
  source = large_image.new()
390
431
  # Important: Maximum size must be allocated before any multiprocess concurrency
391
432
  add_tile_to_source(source, np.zeros(1, 1, 3), dict(x=max_x, y=max_y, z=max_z))
@@ -397,4 +438,10 @@ In some cases, it may be beneficial to write to a single image from multiple pro
397
438
  )
398
439
  source.write('/tmp/sample.zarr.zip', lossy=False)
399
440
 
441
+
442
+ More examples
443
+ ~~~~~~~~~~~~~
444
+
445
+ To see more examples of using ``large-image-source-zarr`` to write images, see :doc:`notebooks` and the `Zarr Sink Tests <https://github.com/girder/large_image/blob/master/test/test_sink.py>`_.
446
+
400
447
  .. _Girder: https://girder.readthedocs.io/en/latest/
@@ -22,7 +22,7 @@
22
22
  },
23
23
  {
24
24
  "cell_type": "code",
25
- "execution_count": null,
25
+ "execution_count": 1,
26
26
  "id": "4ba28d02",
27
27
  "metadata": {},
28
28
  "outputs": [],
@@ -37,7 +37,7 @@
37
37
  },
38
38
  {
39
39
  "cell_type": "code",
40
- "execution_count": null,
40
+ "execution_count": 2,
41
41
  "id": "63c0c38f",
42
42
  "metadata": {},
43
43
  "outputs": [],
@@ -164,7 +164,7 @@
164
164
  {
165
165
  "data": {
166
166
  "application/vnd.jupyter.widget-view+json": {
167
- "model_id": "bf6d0e9480cb43ef9851d7bd3ca7e356",
167
+ "model_id": "97c6787b148c4b4f9639d623f32f8a3a",
168
168
  "version_major": 2,
169
169
  "version_minor": 0
170
170
  },
@@ -191,7 +191,7 @@
191
191
  },
192
192
  {
193
193
  "cell_type": "code",
194
- "execution_count": null,
194
+ "execution_count": 7,
195
195
  "id": "0e75e6de",
196
196
  "metadata": {},
197
197
  "outputs": [],
@@ -228,10 +228,22 @@
228
228
  "data": {
229
229
  "application/json": {
230
230
  "IndexRange": {
231
- "IndexI": 3
231
+ "IndexFOOTPRINT": 3
232
232
  },
233
233
  "IndexStride": {
234
- "IndexI": 1
234
+ "IndexFOOTPRINT": 1
235
+ },
236
+ "ValueFOOTPRINT": {
237
+ "datatype": "int64",
238
+ "max": 50,
239
+ "min": 1,
240
+ "uniform": true,
241
+ "units": null,
242
+ "values": [
243
+ 1,
244
+ 10,
245
+ 50
246
+ ]
235
247
  },
236
248
  "bandCount": 3,
237
249
  "channelmap": {
@@ -246,19 +258,22 @@
246
258
  "Channel": "Band 1",
247
259
  "Frame": 0,
248
260
  "Index": 0,
249
- "IndexI": 0
261
+ "IndexFOOTPRINT": 0,
262
+ "ValueFOOTPRINT": 1
250
263
  },
251
264
  {
252
265
  "Channel": "Band 1",
253
266
  "Frame": 1,
254
267
  "Index": 1,
255
- "IndexI": 1
268
+ "IndexFOOTPRINT": 1,
269
+ "ValueFOOTPRINT": 10
256
270
  },
257
271
  {
258
272
  "Channel": "Band 1",
259
273
  "Frame": 2,
260
274
  "Index": 2,
261
- "IndexI": 2
275
+ "IndexFOOTPRINT": 2,
276
+ "ValueFOOTPRINT": 50
262
277
  }
263
278
  ],
264
279
  "levels": 6,
@@ -281,16 +296,34 @@
281
296
  " 'mm_y': 0,\n",
282
297
  " 'dtype': 'float64',\n",
283
298
  " 'bandCount': 3,\n",
284
- " 'frames': [{'Frame': 0, 'IndexI': 0, 'Index': 0, 'Channel': 'Band 1'},\n",
285
- " {'Frame': 1, 'IndexI': 1, 'Index': 1, 'Channel': 'Band 1'},\n",
286
- " {'Frame': 2, 'IndexI': 2, 'Index': 2, 'Channel': 'Band 1'}],\n",
287
- " 'IndexRange': {'IndexI': 3},\n",
288
- " 'IndexStride': {'IndexI': 1},\n",
299
+ " 'frames': [{'Frame': 0,\n",
300
+ " 'IndexFOOTPRINT': 0,\n",
301
+ " 'ValueFOOTPRINT': 1,\n",
302
+ " 'Index': 0,\n",
303
+ " 'Channel': 'Band 1'},\n",
304
+ " {'Frame': 1,\n",
305
+ " 'IndexFOOTPRINT': 1,\n",
306
+ " 'ValueFOOTPRINT': 10,\n",
307
+ " 'Index': 1,\n",
308
+ " 'Channel': 'Band 1'},\n",
309
+ " {'Frame': 2,\n",
310
+ " 'IndexFOOTPRINT': 2,\n",
311
+ " 'ValueFOOTPRINT': 50,\n",
312
+ " 'Index': 2,\n",
313
+ " 'Channel': 'Band 1'}],\n",
314
+ " 'ValueFOOTPRINT': {'values': [1, 10, 50],\n",
315
+ " 'uniform': True,\n",
316
+ " 'units': None,\n",
317
+ " 'min': 1,\n",
318
+ " 'max': 50,\n",
319
+ " 'datatype': 'int64'},\n",
320
+ " 'IndexRange': {'IndexFOOTPRINT': 3},\n",
321
+ " 'IndexStride': {'IndexFOOTPRINT': 1},\n",
289
322
  " 'channels': ['Band 1'],\n",
290
323
  " 'channelmap': {'Band 1': 0}}"
291
324
  ]
292
325
  },
293
- "execution_count": 7,
326
+ "execution_count": 8,
294
327
  "metadata": {},
295
328
  "output_type": "execute_result"
296
329
  }
@@ -315,7 +348,7 @@
315
348
  "\n",
316
349
  " # add modified tile to sink\n",
317
350
  " # specify tile x, tile y, and any arbitrary frame parameters\n",
318
- " sink.addTile(processed_tile, x=tile['x'], y=tile['y'], i=i)\n",
351
+ " sink.addTile(processed_tile, x=tile['x'], y=tile['y'], footprint=i, footprint_value=footprint_size)\n",
319
352
  "# view metadata\n",
320
353
  "sink.getMetadata()"
321
354
  ]
@@ -329,7 +362,7 @@
329
362
  {
330
363
  "data": {
331
364
  "application/vnd.jupyter.widget-view+json": {
332
- "model_id": "9b8e6175005d4af89cb4cfada7b72983",
365
+ "model_id": "fb60c2b967274a99a632f32f99389705",
333
366
  "version_major": 2,
334
367
  "version_minor": 0
335
368
  },
@@ -398,10 +431,10 @@
398
431
  "data": {
399
432
  "application/json": {
400
433
  "IndexRange": {
401
- "IndexI": 3
434
+ "IndexFOOTPRINT": 3
402
435
  },
403
436
  "IndexStride": {
404
- "IndexI": 1
437
+ "IndexFOOTPRINT": 1
405
438
  },
406
439
  "bandCount": 3,
407
440
  "channelmap": {
@@ -416,19 +449,19 @@
416
449
  "Channel": "Band 1",
417
450
  "Frame": 0,
418
451
  "Index": 0,
419
- "IndexI": 0
452
+ "IndexFOOTPRINT": 0
420
453
  },
421
454
  {
422
455
  "Channel": "Band 1",
423
456
  "Frame": 1,
424
457
  "Index": 1,
425
- "IndexI": 1
458
+ "IndexFOOTPRINT": 1
426
459
  },
427
460
  {
428
461
  "Channel": "Band 1",
429
462
  "Frame": 2,
430
463
  "Index": 2,
431
- "IndexI": 2
464
+ "IndexFOOTPRINT": 2
432
465
  }
433
466
  ],
434
467
  "levels": 4,
@@ -451,16 +484,16 @@
451
484
  " 'mm_y': None,\n",
452
485
  " 'dtype': 'uint16',\n",
453
486
  " 'bandCount': 3,\n",
454
- " 'frames': [{'Channel': 'Band 1', 'Frame': 0, 'Index': 0, 'IndexI': 0},\n",
455
- " {'Channel': 'Band 1', 'Frame': 1, 'Index': 1, 'IndexI': 1},\n",
456
- " {'Channel': 'Band 1', 'Frame': 2, 'Index': 2, 'IndexI': 2}],\n",
457
- " 'IndexRange': {'IndexI': 3},\n",
458
- " 'IndexStride': {'IndexI': 1},\n",
487
+ " 'frames': [{'Channel': 'Band 1', 'Frame': 0, 'Index': 0, 'IndexFOOTPRINT': 0},\n",
488
+ " {'Channel': 'Band 1', 'Frame': 1, 'Index': 1, 'IndexFOOTPRINT': 1},\n",
489
+ " {'Channel': 'Band 1', 'Frame': 2, 'Index': 2, 'IndexFOOTPRINT': 2}],\n",
490
+ " 'IndexRange': {'IndexFOOTPRINT': 3},\n",
491
+ " 'IndexStride': {'IndexFOOTPRINT': 1},\n",
459
492
  " 'channels': ['Band 1'],\n",
460
493
  " 'channelmap': {'Band 1': 0}}"
461
494
  ]
462
495
  },
463
- "execution_count": 10,
496
+ "execution_count": 11,
464
497
  "metadata": {},
465
498
  "output_type": "execute_result"
466
499
  }
@@ -506,7 +539,7 @@
506
539
  {
507
540
  "data": {
508
541
  "application/vnd.jupyter.widget-view+json": {
509
- "model_id": "30812bb388a0426da9806e62bf5e8711",
542
+ "model_id": "a2d3df88fbd44079877b8f314ed97e6f",
510
543
  "version_major": 2,
511
544
  "version_minor": 0
512
545
  },
@@ -1315,6 +1315,58 @@ class TileSource(IPyLeafletMixin):
1315
1315
  def metadata(self) -> JSONDict:
1316
1316
  return self.getMetadata()
1317
1317
 
1318
+ def _getFrameValueInformation(self, frames: List[Dict]):
1319
+ """
1320
+ Given a `frames` list from a metadata response, return a dictionary describing
1321
+ the value info for any frame axes. Keys in this dictionary follow the pattern "Value[AXIS]"
1322
+ and each maps to a dictionary describing the axis, including a list of values, whether the
1323
+ axis is uniform, the units, minimum value, maximum value, and data type.
1324
+
1325
+ :param frames: A list of dictionaries describing each frame in the image
1326
+ :returns: A dictionary describing the values of frame axes
1327
+ """
1328
+ refvalues: Dict[str, Dict[str, List]] = {}
1329
+ for frame in frames:
1330
+ for key, value in frame.items():
1331
+ if 'Value' in key:
1332
+ if key not in refvalues:
1333
+ refvalues[key] = {}
1334
+ value_index = str(frame.get(key.replace('Value', 'Index')))
1335
+ if value_index not in refvalues[key]:
1336
+ refvalues[key][value_index] = [value]
1337
+ else:
1338
+ refvalues[key][value_index].append(value)
1339
+ frame_value_info = {}
1340
+ for key, value_mapping in refvalues.items():
1341
+ axis_name = key.replace('Value', '').lower()
1342
+ units = None
1343
+ if hasattr(self, 'frameUnits') and self.frameUnits is not None:
1344
+ units = self.frameUnits.get(axis_name)
1345
+ uniform = all(len(set(value_list)) <= 1 for value_list in value_mapping.values())
1346
+ if uniform:
1347
+ # for uniform values, only record values at each axis index
1348
+ values = [
1349
+ value_list[0] for value_list in value_mapping.values() if len(value_list)
1350
+ ]
1351
+ else:
1352
+ # for non-uniform axes, record values at every frame
1353
+ values = [frame.get(key) for frame in frames]
1354
+ try:
1355
+ min_val = min(values)
1356
+ max_val = max(values)
1357
+ except TypeError:
1358
+ min_val = None
1359
+ max_val = None
1360
+ frame_value_info[key] = dict(
1361
+ values=values,
1362
+ uniform=uniform,
1363
+ units=units,
1364
+ min=min_val,
1365
+ max=max_val,
1366
+ datatype=np.array(values).dtype.name,
1367
+ )
1368
+ return frame_value_info
1369
+
1318
1370
  def _addMetadataFrameInformation(
1319
1371
  self, metadata: JSONDict, channels: Optional[List[str]] = None) -> None:
1320
1372
  """
@@ -1346,6 +1398,7 @@ class TileSource(IPyLeafletMixin):
1346
1398
  metadata['frames'][idx].get(key) for key in refkeys)):
1347
1399
  index += 1
1348
1400
  frame['Index'] = index
1401
+ metadata.update(self._getFrameValueInformation(metadata['frames']))
1349
1402
  if any(val > 1 for val in maxref.values()):
1350
1403
  metadata['IndexRange'] = {key: value for key, value in maxref.items() if value > 1}
1351
1404
  metadata['IndexStride'] = {