large-image 1.30.2__tar.gz → 1.30.2.dev2__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/large_image.egg-info → large_image-1.30.2.dev2}/PKG-INFO +74 -74
  2. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/getting_started.rst +6 -53
  3. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/girder_config_options.rst +2 -6
  4. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/notebooks/zarr_sink_example.ipynb +29 -62
  5. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/tilesource/base.py +1 -55
  6. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/tilesource/utilities.py +0 -6
  7. {large_image-1.30.2 → large_image-1.30.2.dev2/large_image.egg-info}/PKG-INFO +74 -74
  8. large_image-1.30.2.dev2/large_image.egg-info/requires.txt +151 -0
  9. large_image-1.30.2/large_image.egg-info/requires.txt +0 -151
  10. {large_image-1.30.2 → large_image-1.30.2.dev2}/LICENSE +0 -0
  11. {large_image-1.30.2 → large_image-1.30.2.dev2}/NOTICE +0 -0
  12. {large_image-1.30.2 → large_image-1.30.2.dev2}/README.rst +0 -0
  13. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/annotations.rst +0 -0
  14. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/api_index.rst +0 -0
  15. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/caching.rst +0 -0
  16. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/conf.py +0 -0
  17. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/config_options.rst +0 -0
  18. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/development.rst +0 -0
  19. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/dicomweb_assetstore.rst +0 -0
  20. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/format_examples_datastore.py +0 -0
  21. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/formats.rst +0 -0
  22. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/generate_format_table.py +0 -0
  23. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/girder_annotation_config_options.rst +0 -0
  24. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/girder_caching.rst +0 -0
  25. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/girder_index.rst +0 -0
  26. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/image_conversion.rst +0 -0
  27. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/index.rst +0 -0
  28. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/make_docs.sh +0 -0
  29. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/multi_source_specification.rst +0 -0
  30. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/notebooks/large_image_examples.ipynb +0 -0
  31. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/notebooks.rst +0 -0
  32. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/plottable.rst +0 -0
  33. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/static/K.png +0 -0
  34. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/static/custom.css +0 -0
  35. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/tilesource_options.rst +0 -0
  36. {large_image-1.30.2 → large_image-1.30.2.dev2}/docs/upgrade.rst +0 -0
  37. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/__init__.py +0 -0
  38. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/cache_util/__init__.py +0 -0
  39. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/cache_util/base.py +0 -0
  40. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/cache_util/cache.py +0 -0
  41. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/cache_util/cachefactory.py +0 -0
  42. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/cache_util/memcache.py +0 -0
  43. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/cache_util/rediscache.py +0 -0
  44. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/config.py +0 -0
  45. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/constants.py +0 -0
  46. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/exceptions.py +0 -0
  47. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/tilesource/__init__.py +0 -0
  48. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/tilesource/geo.py +0 -0
  49. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/tilesource/jupyter.py +0 -0
  50. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/tilesource/resample.py +0 -0
  51. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/tilesource/stylefuncs.py +0 -0
  52. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/tilesource/tiledict.py +0 -0
  53. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image/tilesource/tileiterator.py +0 -0
  54. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image.egg-info/SOURCES.txt +0 -0
  55. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image.egg-info/dependency_links.txt +0 -0
  56. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image.egg-info/not-zip-safe +0 -0
  57. {large_image-1.30.2 → large_image-1.30.2.dev2}/large_image.egg-info/top_level.txt +0 -0
  58. {large_image-1.30.2 → large_image-1.30.2.dev2}/setup.cfg +0 -0
  59. {large_image-1.30.2 → large_image-1.30.2.dev2}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: large-image
3
- Version: 1.30.2
3
+ Version: 1.30.2.dev2
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; extra == "converter"
33
+ Requires-Dist: large-image-converter>=1.30.2.dev2; 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; extra == "bioformats"
42
+ Requires-Dist: large-image-source-bioformats>=1.30.2.dev2; extra == "bioformats"
43
43
  Provides-Extra: deepzoom
44
- Requires-Dist: large-image-source-deepzoom>=1.30.2; extra == "deepzoom"
44
+ Requires-Dist: large-image-source-deepzoom>=1.30.2.dev2; extra == "deepzoom"
45
45
  Provides-Extra: dicom
46
- Requires-Dist: large-image-source-dicom>=1.30.2; extra == "dicom"
46
+ Requires-Dist: large-image-source-dicom>=1.30.2.dev2; extra == "dicom"
47
47
  Provides-Extra: dummy
48
- Requires-Dist: large-image-source-dummy>=1.30.2; extra == "dummy"
48
+ Requires-Dist: large-image-source-dummy>=1.30.2.dev2; extra == "dummy"
49
49
  Provides-Extra: gdal
50
- Requires-Dist: large-image-source-gdal>=1.30.2; extra == "gdal"
50
+ Requires-Dist: large-image-source-gdal>=1.30.2.dev2; extra == "gdal"
51
51
  Provides-Extra: mapnik
52
- Requires-Dist: large-image-source-mapnik>=1.30.2; extra == "mapnik"
52
+ Requires-Dist: large-image-source-mapnik>=1.30.2.dev2; extra == "mapnik"
53
53
  Provides-Extra: multi
54
- Requires-Dist: large-image-source-multi>=1.30.2; extra == "multi"
54
+ Requires-Dist: large-image-source-multi>=1.30.2.dev2; extra == "multi"
55
55
  Provides-Extra: nd2
56
- Requires-Dist: large-image-source-nd2>=1.30.2; extra == "nd2"
56
+ Requires-Dist: large-image-source-nd2>=1.30.2.dev2; extra == "nd2"
57
57
  Provides-Extra: ometiff
58
- Requires-Dist: large-image-source-ometiff>=1.30.2; extra == "ometiff"
58
+ Requires-Dist: large-image-source-ometiff>=1.30.2.dev2; extra == "ometiff"
59
59
  Provides-Extra: openjpeg
60
- Requires-Dist: large-image-source-openjpeg>=1.30.2; extra == "openjpeg"
60
+ Requires-Dist: large-image-source-openjpeg>=1.30.2.dev2; extra == "openjpeg"
61
61
  Provides-Extra: openslide
62
- Requires-Dist: large-image-source-openslide>=1.30.2; extra == "openslide"
62
+ Requires-Dist: large-image-source-openslide>=1.30.2.dev2; extra == "openslide"
63
63
  Provides-Extra: pil
64
- Requires-Dist: large-image-source-pil>=1.30.2; extra == "pil"
64
+ Requires-Dist: large-image-source-pil>=1.30.2.dev2; extra == "pil"
65
65
  Provides-Extra: rasterio
66
- Requires-Dist: large-image-source-rasterio>=1.30.2; extra == "rasterio"
66
+ Requires-Dist: large-image-source-rasterio>=1.30.2.dev2; extra == "rasterio"
67
67
  Provides-Extra: test
68
- Requires-Dist: large-image-source-test>=1.30.2; extra == "test"
68
+ Requires-Dist: large-image-source-test>=1.30.2.dev2; extra == "test"
69
69
  Provides-Extra: tiff
70
- Requires-Dist: large-image-source-tiff>=1.30.2; extra == "tiff"
70
+ Requires-Dist: large-image-source-tiff>=1.30.2.dev2; extra == "tiff"
71
71
  Provides-Extra: tifffile
72
- Requires-Dist: large-image-source-tifffile>=1.30.2; extra == "tifffile"
72
+ Requires-Dist: large-image-source-tifffile>=1.30.2.dev2; extra == "tifffile"
73
73
  Provides-Extra: vips
74
- Requires-Dist: large-image-source-vips>=1.30.2; extra == "vips"
74
+ Requires-Dist: large-image-source-vips>=1.30.2.dev2; extra == "vips"
75
75
  Provides-Extra: zarr
76
- Requires-Dist: large-image-source-zarr>=1.30.2; extra == "zarr"
76
+ Requires-Dist: large-image-source-zarr>=1.30.2.dev2; extra == "zarr"
77
77
  Provides-Extra: sources
78
- Requires-Dist: large-image-source-openjpeg>=1.30.2; extra == "sources"
79
- Requires-Dist: large-image-source-gdal>=1.30.2; extra == "sources"
80
- Requires-Dist: large-image-source-nd2>=1.30.2; extra == "sources"
81
- Requires-Dist: large-image-source-openslide>=1.30.2; extra == "sources"
82
- Requires-Dist: large-image-source-dicom>=1.30.2; extra == "sources"
83
- Requires-Dist: large-image-source-rasterio>=1.30.2; extra == "sources"
84
- Requires-Dist: large-image-source-test>=1.30.2; extra == "sources"
85
- Requires-Dist: large-image-source-tifffile>=1.30.2; extra == "sources"
86
- Requires-Dist: large-image-source-zarr>=1.30.2; extra == "sources"
87
- Requires-Dist: large-image-source-mapnik>=1.30.2; extra == "sources"
88
- Requires-Dist: large-image-source-multi>=1.30.2; extra == "sources"
89
- Requires-Dist: large-image-source-ometiff>=1.30.2; extra == "sources"
90
- Requires-Dist: large-image-source-tiff>=1.30.2; extra == "sources"
91
- Requires-Dist: large-image-source-pil>=1.30.2; extra == "sources"
92
- Requires-Dist: large-image-source-vips>=1.30.2; extra == "sources"
93
- Requires-Dist: large-image-source-dummy>=1.30.2; extra == "sources"
94
- Requires-Dist: large-image-source-bioformats>=1.30.2; extra == "sources"
95
- Requires-Dist: large-image-source-deepzoom>=1.30.2; extra == "sources"
78
+ Requires-Dist: large-image-source-mapnik>=1.30.2.dev2; extra == "sources"
79
+ Requires-Dist: large-image-source-multi>=1.30.2.dev2; extra == "sources"
80
+ Requires-Dist: large-image-source-dicom>=1.30.2.dev2; extra == "sources"
81
+ Requires-Dist: large-image-source-ometiff>=1.30.2.dev2; extra == "sources"
82
+ Requires-Dist: large-image-source-tiff>=1.30.2.dev2; extra == "sources"
83
+ Requires-Dist: large-image-source-deepzoom>=1.30.2.dev2; extra == "sources"
84
+ Requires-Dist: large-image-source-vips>=1.30.2.dev2; extra == "sources"
85
+ Requires-Dist: large-image-source-bioformats>=1.30.2.dev2; extra == "sources"
86
+ Requires-Dist: large-image-source-nd2>=1.30.2.dev2; extra == "sources"
87
+ Requires-Dist: large-image-source-openjpeg>=1.30.2.dev2; extra == "sources"
88
+ Requires-Dist: large-image-source-pil>=1.30.2.dev2; extra == "sources"
89
+ Requires-Dist: large-image-source-test>=1.30.2.dev2; extra == "sources"
90
+ Requires-Dist: large-image-source-rasterio>=1.30.2.dev2; extra == "sources"
91
+ Requires-Dist: large-image-source-gdal>=1.30.2.dev2; extra == "sources"
92
+ Requires-Dist: large-image-source-openslide>=1.30.2.dev2; extra == "sources"
93
+ Requires-Dist: large-image-source-tifffile>=1.30.2.dev2; extra == "sources"
94
+ Requires-Dist: large-image-source-dummy>=1.30.2.dev2; extra == "sources"
95
+ Requires-Dist: large-image-source-zarr>=1.30.2.dev2; extra == "sources"
96
96
  Provides-Extra: all
97
- Requires-Dist: large-image-source-openjpeg>=1.30.2; extra == "all"
98
- Requires-Dist: large-image-source-gdal>=1.30.2; extra == "all"
99
- Requires-Dist: large-image-source-dicom>=1.30.2; extra == "all"
97
+ Requires-Dist: large-image-source-mapnik>=1.30.2.dev2; extra == "all"
98
+ Requires-Dist: psutil>=4.2.0; extra == "all"
99
+ Requires-Dist: large-image-source-dicom>=1.30.2.dev2; extra == "all"
100
+ Requires-Dist: large-image-source-vips>=1.30.2.dev2; extra == "all"
101
+ Requires-Dist: large-image-source-deepzoom>=1.30.2.dev2; extra == "all"
102
+ Requires-Dist: large-image-converter>=1.30.2.dev2; extra == "all"
103
+ Requires-Dist: large-image-source-openjpeg>=1.30.2.dev2; extra == "all"
104
+ Requires-Dist: large-image-source-test>=1.30.2.dev2; extra == "all"
105
+ Requires-Dist: large-image-source-rasterio[all]>=1.30.2.dev2; extra == "all"
106
+ Requires-Dist: large-image-source-rasterio>=1.30.2.dev2; extra == "all"
107
+ Requires-Dist: large-image-source-gdal>=1.30.2.dev2; extra == "all"
108
+ Requires-Dist: large-image-source-zarr>=1.30.2.dev2; extra == "all"
100
109
  Requires-Dist: pylibmc>=1.5.1; platform_system != "Windows" and extra == "all"
101
- Requires-Dist: large-image-source-pil>=1.30.2; extra == "all"
102
- Requires-Dist: large-image-source-bioformats>=1.30.2; extra == "all"
103
- Requires-Dist: large-image-source-tifffile>=1.30.2; extra == "all"
104
- Requires-Dist: large-image-source-vips>=1.30.2; extra == "all"
105
- Requires-Dist: large-image-source-dummy>=1.30.2; extra == "all"
106
- Requires-Dist: pyvips; extra == "all"
107
- Requires-Dist: large-image-source-deepzoom>=1.30.2; extra == "all"
108
- Requires-Dist: large-image-source-pil[all]>=1.30.2; extra == "all"
109
- Requires-Dist: large-image-converter>=1.30.2; extra == "all"
110
- Requires-Dist: large-image-source-rasterio[all]>=1.30.2; extra == "all"
111
- Requires-Dist: large-image-source-test>=1.30.2; extra == "all"
112
- Requires-Dist: large-image-source-nd2>=1.30.2; extra == "all"
113
- Requires-Dist: large-image-source-tiff[all]>=1.30.2; extra == "all"
114
- Requires-Dist: large-image-source-rasterio>=1.30.2; extra == "all"
115
- Requires-Dist: large-image-source-multi[all]>=1.30.2; extra == "all"
116
- Requires-Dist: redis>=4.5.5; extra == "all"
110
+ Requires-Dist: large-image-source-multi[all]>=1.30.2.dev2; extra == "all"
117
111
  Requires-Dist: matplotlib; extra == "all"
118
- Requires-Dist: large-image-source-zarr>=1.30.2; extra == "all"
119
- Requires-Dist: psutil>=4.2.0; extra == "all"
120
- Requires-Dist: large-image-source-mapnik>=1.30.2; extra == "all"
112
+ Requires-Dist: large-image-source-multi>=1.30.2.dev2; extra == "all"
113
+ Requires-Dist: large-image-source-ometiff>=1.30.2.dev2; extra == "all"
114
+ Requires-Dist: large-image-source-tiff>=1.30.2.dev2; extra == "all"
115
+ Requires-Dist: large-image-source-pil[all]>=1.30.2.dev2; extra == "all"
121
116
  Requires-Dist: simplejpeg; extra == "all"
122
- Requires-Dist: large-image-source-ometiff>=1.30.2; extra == "all"
123
- Requires-Dist: large-image-source-multi>=1.30.2; extra == "all"
124
- Requires-Dist: large-image-source-openslide>=1.30.2; extra == "all"
125
- Requires-Dist: large-image-source-tiff>=1.30.2; extra == "all"
117
+ Requires-Dist: large-image-source-bioformats>=1.30.2.dev2; extra == "all"
118
+ Requires-Dist: large-image-source-nd2>=1.30.2.dev2; extra == "all"
119
+ Requires-Dist: large-image-source-pil>=1.30.2.dev2; extra == "all"
120
+ Requires-Dist: redis>=4.5.5; extra == "all"
121
+ Requires-Dist: pyvips; extra == "all"
122
+ Requires-Dist: large-image-source-tiff[all]>=1.30.2.dev2; extra == "all"
123
+ Requires-Dist: large-image-source-openslide>=1.30.2.dev2; extra == "all"
124
+ Requires-Dist: large-image-source-tifffile>=1.30.2.dev2; extra == "all"
125
+ Requires-Dist: large-image-source-dummy>=1.30.2.dev2; extra == "all"
126
126
  Provides-Extra: common
127
- Requires-Dist: large-image-source-pil[all]>=1.30.2; extra == "common"
128
- Requires-Dist: large-image-source-rasterio[all]>=1.30.2; extra == "common"
129
- Requires-Dist: large-image-source-test>=1.30.2; extra == "common"
130
- Requires-Dist: large-image-source-nd2>=1.30.2; extra == "common"
131
- Requires-Dist: large-image-source-dicom>=1.30.2; extra == "common"
132
- Requires-Dist: redis>=4.5.5; extra == "common"
133
127
  Requires-Dist: matplotlib; extra == "common"
134
- Requires-Dist: large-image-source-zarr>=1.30.2; extra == "common"
128
+ Requires-Dist: large-image-source-multi>=1.30.2.dev2; extra == "common"
135
129
  Requires-Dist: psutil>=4.2.0; extra == "common"
130
+ Requires-Dist: large-image-source-dicom>=1.30.2.dev2; extra == "common"
131
+ Requires-Dist: large-image-source-pil[all]>=1.30.2.dev2; extra == "common"
136
132
  Requires-Dist: simplejpeg; extra == "common"
137
- Requires-Dist: large-image-source-multi>=1.30.2; extra == "common"
133
+ Requires-Dist: large-image-source-deepzoom>=1.30.2.dev2; extra == "common"
134
+ Requires-Dist: large-image-source-nd2>=1.30.2.dev2; extra == "common"
135
+ Requires-Dist: redis>=4.5.5; extra == "common"
136
+ Requires-Dist: large-image-source-test>=1.30.2.dev2; extra == "common"
137
+ Requires-Dist: large-image-source-rasterio[all]>=1.30.2.dev2; extra == "common"
138
+ Requires-Dist: large-image-source-zarr>=1.30.2.dev2; extra == "common"
138
139
  Requires-Dist: pylibmc>=1.5.1; platform_system != "Windows" and extra == "common"
139
- Requires-Dist: large-image-source-tifffile>=1.30.2; extra == "common"
140
- Requires-Dist: large-image-source-deepzoom>=1.30.2; extra == "common"
140
+ Requires-Dist: large-image-source-tifffile>=1.30.2.dev2; extra == "common"
141
141
 
142
142
  Large Image
143
143
  ===========
@@ -334,60 +334,25 @@ 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 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``.
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.
342
338
 
343
339
  .. code-block:: python
344
340
 
345
341
  import large_image
346
-
347
342
  source = large_image.new()
348
343
  for nparray, x, y in fancy_algorithm():
349
344
  # We could optionally add a mask to limit the output
350
345
  source.addTile(nparray, x, y)
351
346
  source.write('/tmp/sample.tiff', lossy=False)
352
347
 
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.
348
+ The ``large-image-source-zarr`` can be used to store multiple frame data with arbitrary axes.
358
349
 
359
350
  .. code-block:: python
360
351
 
361
352
  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
-
367
353
  source = large_image.new()
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
-
354
+ for nparray, x, y, time, param1 in fancy_algorithm():
355
+ source.addTile(nparray, x, y, time=time, p1=param1)
391
356
  # The writer supports a variety of formats
392
357
  source.write('/tmp/sample.zarr.zip', lossy=False)
393
358
 
@@ -396,37 +361,31 @@ You may also choose to read tiles from one source and write modified tiles to a
396
361
  .. code-block:: python
397
362
 
398
363
  import large_image
399
-
400
364
  original_source = large_image.open('path/to/original/image.tiff')
401
365
  new_source = large_image.new()
402
366
  for frame in original_source.getMetadata().get('frames', []):
403
367
  for tile in original_source.tileIterator(frame=frame['Frame'], format='numpy'):
404
- tile_data, x, y = tile['tile'], tile['x'], tile['y']
368
+ t, x, y = tile['tile'], tile['x'], tile['y']
405
369
  kwargs = {
406
370
  'z': frame['IndexZ'],
407
371
  'c': frame['IndexC'],
408
372
  }
409
- modified_tile = modify_tile(tile_data)
373
+ modified_tile = modify_tile(t)
410
374
  new_source.addTile(modified_tile, x=x, y=y, **kwargs)
411
375
  new_source.write('path/to/new/image.tiff', lossy=False)
412
376
 
413
- Multiple processes
414
- ~~~~~~~~~~~~~~~~~~
415
-
416
377
  In some cases, it may be beneficial to write to a single image from multiple processes or threads:
417
378
 
418
379
  .. code-block:: python
419
380
 
420
381
  import large_image
421
382
  import multiprocessing
422
-
423
383
  # Important: Must be a pickleable function
424
384
  def add_tile_to_source(tilesource, nparray, position):
425
385
  tilesource.addTile(
426
386
  nparray,
427
387
  **position
428
388
  )
429
-
430
389
  source = large_image.new()
431
390
  # Important: Maximum size must be allocated before any multiprocess concurrency
432
391
  add_tile_to_source(source, np.zeros(1, 1, 3), dict(x=max_x, y=max_y, z=max_z))
@@ -438,10 +397,4 @@ In some cases, it may be beneficial to write to a single image from multiple pro
438
397
  )
439
398
  source.write('/tmp/sample.zarr.zip', lossy=False)
440
399
 
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
-
447
400
  .. _Girder: https://girder.readthedocs.io/en/latest/
@@ -94,14 +94,10 @@ This is used to specify how items appear in item lists. There are two settings,
94
94
  # clicking on an item from showing the item page to another action.
95
95
  navigate:
96
96
  # type can be "item": the default, open the item page, "itemList": go
97
- # to the named item page, or "open" to open an application
97
+ # to the named item page
98
98
  type: itemList
99
99
  # if the type is "itemList", the name is the name of the itemList to
100
- # display. If the type is "open", the name is the name of the
101
- # registered application that should be opened by preference (e.g.,
102
- # "histomicsui" or "volview"). If that application does not report it
103
- # can open the item or no name is specified, the highest priority
104
- # application that can open the item will be used.
100
+ # display.
105
101
  name: studyList
106
102
  # show these columns in order from left to right. Each column has a
107
103
  # "type" and "value". It optionally has a "title" used for the column
@@ -22,7 +22,7 @@
22
22
  },
23
23
  {
24
24
  "cell_type": "code",
25
- "execution_count": 1,
25
+ "execution_count": null,
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": 2,
40
+ "execution_count": null,
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": "97c6787b148c4b4f9639d623f32f8a3a",
167
+ "model_id": "bf6d0e9480cb43ef9851d7bd3ca7e356",
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": 7,
194
+ "execution_count": null,
195
195
  "id": "0e75e6de",
196
196
  "metadata": {},
197
197
  "outputs": [],
@@ -228,22 +228,10 @@
228
228
  "data": {
229
229
  "application/json": {
230
230
  "IndexRange": {
231
- "IndexFOOTPRINT": 3
231
+ "IndexI": 3
232
232
  },
233
233
  "IndexStride": {
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
- ]
234
+ "IndexI": 1
247
235
  },
248
236
  "bandCount": 3,
249
237
  "channelmap": {
@@ -258,22 +246,19 @@
258
246
  "Channel": "Band 1",
259
247
  "Frame": 0,
260
248
  "Index": 0,
261
- "IndexFOOTPRINT": 0,
262
- "ValueFOOTPRINT": 1
249
+ "IndexI": 0
263
250
  },
264
251
  {
265
252
  "Channel": "Band 1",
266
253
  "Frame": 1,
267
254
  "Index": 1,
268
- "IndexFOOTPRINT": 1,
269
- "ValueFOOTPRINT": 10
255
+ "IndexI": 1
270
256
  },
271
257
  {
272
258
  "Channel": "Band 1",
273
259
  "Frame": 2,
274
260
  "Index": 2,
275
- "IndexFOOTPRINT": 2,
276
- "ValueFOOTPRINT": 50
261
+ "IndexI": 2
277
262
  }
278
263
  ],
279
264
  "levels": 6,
@@ -296,34 +281,16 @@
296
281
  " 'mm_y': 0,\n",
297
282
  " 'dtype': 'float64',\n",
298
283
  " 'bandCount': 3,\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",
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",
322
289
  " 'channels': ['Band 1'],\n",
323
290
  " 'channelmap': {'Band 1': 0}}"
324
291
  ]
325
292
  },
326
- "execution_count": 8,
293
+ "execution_count": 7,
327
294
  "metadata": {},
328
295
  "output_type": "execute_result"
329
296
  }
@@ -348,7 +315,7 @@
348
315
  "\n",
349
316
  " # add modified tile to sink\n",
350
317
  " # specify tile x, tile y, and any arbitrary frame parameters\n",
351
- " sink.addTile(processed_tile, x=tile['x'], y=tile['y'], footprint=i, footprint_value=footprint_size)\n",
318
+ " sink.addTile(processed_tile, x=tile['x'], y=tile['y'], i=i)\n",
352
319
  "# view metadata\n",
353
320
  "sink.getMetadata()"
354
321
  ]
@@ -362,7 +329,7 @@
362
329
  {
363
330
  "data": {
364
331
  "application/vnd.jupyter.widget-view+json": {
365
- "model_id": "fb60c2b967274a99a632f32f99389705",
332
+ "model_id": "9b8e6175005d4af89cb4cfada7b72983",
366
333
  "version_major": 2,
367
334
  "version_minor": 0
368
335
  },
@@ -431,10 +398,10 @@
431
398
  "data": {
432
399
  "application/json": {
433
400
  "IndexRange": {
434
- "IndexFOOTPRINT": 3
401
+ "IndexI": 3
435
402
  },
436
403
  "IndexStride": {
437
- "IndexFOOTPRINT": 1
404
+ "IndexI": 1
438
405
  },
439
406
  "bandCount": 3,
440
407
  "channelmap": {
@@ -449,19 +416,19 @@
449
416
  "Channel": "Band 1",
450
417
  "Frame": 0,
451
418
  "Index": 0,
452
- "IndexFOOTPRINT": 0
419
+ "IndexI": 0
453
420
  },
454
421
  {
455
422
  "Channel": "Band 1",
456
423
  "Frame": 1,
457
424
  "Index": 1,
458
- "IndexFOOTPRINT": 1
425
+ "IndexI": 1
459
426
  },
460
427
  {
461
428
  "Channel": "Band 1",
462
429
  "Frame": 2,
463
430
  "Index": 2,
464
- "IndexFOOTPRINT": 2
431
+ "IndexI": 2
465
432
  }
466
433
  ],
467
434
  "levels": 4,
@@ -484,16 +451,16 @@
484
451
  " 'mm_y': None,\n",
485
452
  " 'dtype': 'uint16',\n",
486
453
  " 'bandCount': 3,\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",
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",
492
459
  " 'channels': ['Band 1'],\n",
493
460
  " 'channelmap': {'Band 1': 0}}"
494
461
  ]
495
462
  },
496
- "execution_count": 11,
463
+ "execution_count": 10,
497
464
  "metadata": {},
498
465
  "output_type": "execute_result"
499
466
  }
@@ -539,7 +506,7 @@
539
506
  {
540
507
  "data": {
541
508
  "application/vnd.jupyter.widget-view+json": {
542
- "model_id": "a2d3df88fbd44079877b8f314ed97e6f",
509
+ "model_id": "30812bb388a0426da9806e62bf5e8711",
543
510
  "version_major": 2,
544
511
  "version_minor": 0
545
512
  },
@@ -1315,58 +1315,6 @@ 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
-
1370
1318
  def _addMetadataFrameInformation(
1371
1319
  self, metadata: JSONDict, channels: Optional[List[str]] = None) -> None:
1372
1320
  """
@@ -1398,7 +1346,6 @@ class TileSource(IPyLeafletMixin):
1398
1346
  metadata['frames'][idx].get(key) for key in refkeys)):
1399
1347
  index += 1
1400
1348
  frame['Index'] = index
1401
- metadata.update(self._getFrameValueInformation(metadata['frames']))
1402
1349
  if any(val > 1 for val in maxref.values()):
1403
1350
  metadata['IndexRange'] = {key: value for key, value in maxref.items() if value > 1}
1404
1351
  metadata['IndexStride'] = {
@@ -1569,8 +1516,7 @@ class TileSource(IPyLeafletMixin):
1569
1516
  if (scale >= max(self.tileWidth, self.tileHeight) or
1570
1517
  (self.dtype and self.dtype != np.uint8) or
1571
1518
  (self.bandCount and self.bandCount > 4)):
1572
- nptile = np.zeros((self.tileHeight, self.tileWidth, cast(int, self.bandCount)),
1573
- dtype=self.dtype)
1519
+ nptile = np.zeros((self.tileHeight, self.tileWidth, cast(int, self.bandCount)))
1574
1520
  maxX = 2.0 ** (z + 1 - self.levels) * self.sizeX / self.tileWidth
1575
1521
  maxY = 2.0 ** (z + 1 - self.levels) * self.sizeY / self.tileHeight
1576
1522
  for newY in range(scale):
@@ -217,12 +217,6 @@ def _imageToPIL(
217
217
  image = np.floor_divide(image, 2 ** 24).astype(np.uint8)
218
218
  elif image.dtype == np.uint16:
219
219
  image = np.floor_divide(image, 256).astype(np.uint8)
220
- elif image.dtype == np.int8:
221
- image = (image.astype(float) + 128).astype(np.uint8)
222
- elif image.dtype == np.int16:
223
- image = np.floor_divide(image.astype(float) + 2 ** 15, 256).astype(np.uint8)
224
- elif image.dtype == np.int32:
225
- image = np.floor_divide(image.astype(float) + 2 ** 31, 2 ** 24).astype(np.uint8)
226
220
  # TODO: The scaling of float data needs to be identical across all
227
221
  # tiles of an image. This means that we need a reference to the parent
228
222
  # tile source or some other way of regulating it.