diff options
Diffstat (limited to 'examples/imageview.py')
-rwxr-xr-x | examples/imageview.py | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/examples/imageview.py b/examples/imageview.py new file mode 100755 index 0000000..34595e2 --- /dev/null +++ b/examples/imageview.py @@ -0,0 +1,153 @@ +#!/usr/bin/env python +# coding: utf-8 +# /*########################################################################## +# +# Copyright (c) 2016-2017 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. +# +# ###########################################################################*/ +""" +Example to show the use of `ImageView` widget. It can be used to open an EDF +or TIFF file from the shell command line. + +To view an image file with the current installed silx library: +``python examples/imageview.py <file to open>`` +To get help: +``python examples/imageview.py -h`` + +For developers with a git clone you can use it with the bootstrap +To view an image file with the current installed silx library: + +``./bootstrap.py python examples/imageview.py <file to open>`` +""" +from __future__ import division + +__authors__ = ["T. Vincent"] +__license__ = "MIT" +__date__ = "18/10/2016" + +import logging +from silx.gui.plot.ImageView import ImageViewMainWindow +from silx.gui import qt +import numpy + +logger = logging.getLogger(__name__) + + +def main(argv=None): + """Display an image from a file in an :class:`ImageView` widget. + + :param argv: list of command line arguments or None (the default) + to use sys.argv. + :type argv: list of str + :return: Exit status code + :rtype: int + :raises IOError: if no image can be loaded from the file + """ + import argparse + import os.path + + from silx.third_party.EdfFile import EdfFile + + # Command-line arguments + parser = argparse.ArgumentParser( + description='Browse the images of an EDF file.') + parser.add_argument( + '-o', '--origin', nargs=2, + type=float, default=(0., 0.), + help="""Coordinates of the origin of the image: (x, y). + Default: 0., 0.""") + parser.add_argument( + '-s', '--scale', nargs=2, + type=float, default=(1., 1.), + help="""Scale factors applied to the image: (sx, sy). + Default: 1., 1.""") + parser.add_argument( + '-l', '--log', action="store_true", + help="Use logarithm normalization for colormap, default: Linear.") + parser.add_argument( + 'filename', nargs='?', + help='EDF filename of the image to open') + args = parser.parse_args(args=argv) + + # Open the input file + if not args.filename: + logger.warning('No image file provided, displaying dummy data') + edfFile = None + data = numpy.arange(1024 * 1024.).reshape(1024, 1024) + nbFrames = 1 + + else: + if not os.path.isfile(args.filename): + raise IOError('No input file: %s' % args.filename) + + else: + edfFile = EdfFile(args.filename) + data = edfFile.GetData(0) + + nbFrames = edfFile.GetNumImages() + if nbFrames == 0: + raise IOError( + 'Cannot read image(s) from file: %s' % args.filename) + + global app # QApplication must be global to avoid seg fault on quit + app = qt.QApplication([]) + sys.excepthook = qt.exceptionHandler + + mainWindow = ImageViewMainWindow() + mainWindow.setAttribute(qt.Qt.WA_DeleteOnClose) + + if args.log: # Use log normalization by default + colormap = mainWindow.getDefaultColormap() + colormap['normalization'] = 'log' + mainWindow.setColormap(colormap) + + mainWindow.setImage(data, + origin=args.origin, + scale=args.scale) + + if edfFile is not None and nbFrames > 1: + # Add a toolbar for multi-frame EDF support + multiFrameToolbar = qt.QToolBar('Multi-frame') + multiFrameToolbar.addWidget(qt.QLabel( + 'Frame [0-%d]:' % (nbFrames - 1))) + + spinBox = qt.QSpinBox() + spinBox.setRange(0, nbFrames - 1) + + def updateImage(index): + mainWindow.setImage(edfFile.GetData(index), + origin=args.origin, + scale=args.scale, + reset=False) + spinBox.valueChanged[int].connect(updateImage) + multiFrameToolbar.addWidget(spinBox) + + mainWindow.addToolBar(multiFrameToolbar) + + mainWindow.show() + mainWindow.setFocus(qt.Qt.OtherFocusReason) + + return app.exec_() + + +if __name__ == "__main__": + import sys + sys.exit(main(argv=sys.argv[1:])) |