summaryrefslogtreecommitdiff
path: root/examples/imageStack.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/imageStack.py')
-rw-r--r--examples/imageStack.py143
1 files changed, 143 insertions, 0 deletions
diff --git a/examples/imageStack.py b/examples/imageStack.py
new file mode 100644
index 0000000..0437a6e
--- /dev/null
+++ b/examples/imageStack.py
@@ -0,0 +1,143 @@
+#!/usr/bin/env python
+# coding: utf-8
+# /*##########################################################################
+#
+# Copyright (c) 2016-2018 European Synchrotron Radiation Facility
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#
+# ###########################################################################*/
+"""
+Simple example for using the ImageStack.
+
+In this example we want to display images from different source: .h5, .edf
+and .npy files.
+
+To do so we simple reimplement the thread managing the loading of data.
+"""
+
+import numpy
+import h5py
+import tempfile
+import logging
+import shutil
+import os
+import time
+from silx.io.url import DataUrl
+from silx.io.utils import get_data
+from silx.gui import qt
+from silx.gui.plot.ImageStack import ImageStack, UrlLoader
+import fabio
+
+
+logging.basicConfig()
+_logger = logging.getLogger("hdf5widget")
+"""Module logger"""
+
+
+def create_random_image():
+ """Create a simple image with random values"""
+ width = numpy.random.randint(100, 400)
+ height = numpy.random.randint(100, 400)
+ return numpy.random.random((width, height))
+
+
+def create_h5py_urls(n_url, file_name):
+ """ creates n urls based on h5py"""
+ res = []
+ with h5py.File(file_name, 'w') as h5f:
+ for i in range(n_url):
+ h5f[str(i)] = create_random_image()
+ res.append(DataUrl(file_path=file_name,
+ data_path=str(i),
+ scheme='silx'))
+ return res
+
+
+def create_numpy_url(file_name):
+ """ create a simple DataUrl with a .npy file """
+ numpy.save(file=file_name, arr=create_random_image())
+ return [DataUrl(file_path=file_name,
+ scheme='numpy'), ]
+
+
+def create_edf_url(file_name):
+ """ create a simple DataUrl with a .edf file"""
+ dsc = fabio.edfimage.EdfImage(data=create_random_image(), header={})
+ dsc.write(file_name)
+ return [DataUrl(file_path=file_name,
+ data_slice=(0,),
+ scheme='fabio'), ]
+
+
+def create_datasets(folder):
+ """create a set of DataUrl containing each one image"""
+ urls = []
+ file_ = os.path.join(folder, 'myh5file.h5')
+ urls.extend(create_h5py_urls(n_url=5, file_name=file_))
+ file_ = os.path.join(folder, 'secondH5file.h5')
+ urls.extend(create_h5py_urls(n_url=2, file_name=file_))
+ file_ = os.path.join(folder, 'firstnumpy_file.npy')
+ urls.extend(create_numpy_url(file_name=file_))
+ file_ = os.path.join(folder, 'secondnumpy_file.npy')
+ urls.extend(create_numpy_url(file_name=file_))
+ file_ = os.path.join(folder, 'single_edf_file.edf')
+ urls.extend(create_edf_url(file_name=file_))
+ file_ = os.path.join(folder, 'single_edf_file_2.edf')
+ urls.extend(create_edf_url(file_name=file_))
+ return urls
+
+
+class MyOwnUrlLoader(UrlLoader):
+ """
+ Thread use to load DataUrl
+ """
+ def __init__(self, parent, url):
+ super(MyOwnUrlLoader, self).__init__(parent=parent, url=url)
+ self.url = url
+ self.data = None
+
+ def run(self):
+ # just to see the waiting interface...
+ time.sleep(1.0)
+ if self.url.scheme() == 'numpy':
+ self.data = numpy.load(self.url.file_path())
+ else:
+ self.data = get_data(self.url)
+
+
+def main():
+ dataset_folder = tempfile.mkdtemp()
+
+ qapp = qt.QApplication([])
+ widget = ImageStack()
+ widget.setUrlLoaderClass(MyOwnUrlLoader)
+ widget.setNPrefetch(1)
+ urls = create_datasets(folder=dataset_folder)
+ widget.setUrls(urls=urls)
+ widget.show()
+ qapp.exec_()
+ widget.close()
+
+ shutil.rmtree(dataset_folder)
+
+
+if __name__ == '__main__':
+ main()
+ exit(0)