# BackgroundImage

VTKExamples/Python/Images/BackgroundImage

### Description

This example displays an image as the "background" of a scene, and renders a superquadric in front of it.

The example accepts a jpeg file on the command line to use as a background image. If there is no file, it generates a simple background.

Other Languages

See (Cxx)

### Code

BackgroundImage.py

    #!/usr/bin/env python
    """
    based on:
     - http://www.vtk.org/Wiki/VTK/Examples/Cxx/Images/BackgroundImage

    tested with:
     - VTK 6.3, Python 2.7
     - VTK 7.0, Python 3.5

    >>> python background_image.py image_filename.jpg
    """
    from __future__ import print_function

    import vtk

    def get_program_parameters():
        import argparse
        description = 'Add a background image at a render window.'
        epilogue = '''
            Add a background image at a render window.
       '''
        parser = argparse.ArgumentParser(description=description, epilog=epilogue)
        parser.add_argument('filename', default=None, type=str, nargs='?', help='A required filename.')
        args = parser.parse_args()
        return args.filename

    def main():
        colors = vtk.vtkNamedColors()

        colors.SetColor('light_cyan', [100, 255, 255, 255])
        colors.SetColor('light_magenta', [255, 100, 255, 255])

        #  Verify input arguments
        fn = get_program_parameters()
        if fn:
            # Read the image
            jpeg_reader = vtk.vtkJPEGReader()
            if not jpeg_reader.CanReadFile(fn):
                print("Error reading file:", fn)
                return

            jpeg_reader.SetFileName(fn)
            jpeg_reader.Update()
            image_data = jpeg_reader.GetOutput()
        else:
            canvas_source = vtk.vtkImageCanvasSource2D()
            canvas_source.SetExtent(0, 100, 0, 100, 0, 0)
            canvas_source.SetScalarTypeToUnsignedChar()
            canvas_source.SetNumberOfScalarComponents(3)
            canvas_source.SetDrawColor(colors.GetColor4ub('warm_grey'))
            canvas_source.FillBox(0, 100, 0, 100)
            canvas_source.SetDrawColor(colors.GetColor4ub('light_cyan'))
            canvas_source.FillTriangle(10, 10, 25, 10, 25, 25)
            canvas_source.SetDrawColor(colors.GetColor4ub('light_magenta'))
            canvas_source.FillTube(75, 75, 0, 75, 5.0)
            canvas_source.Update()
            image_data = canvas_source.GetOutput()

        # Create an image actor to display the image
        image_actor = vtk.vtkImageActor()
        image_actor.SetInputData(image_data)

        # Create a renderer to display the image in the background
        background_renderer = vtk.vtkRenderer()

        # Create a superquadric
        superquadric_source = vtk.vtkSuperquadricSource()
        superquadric_source.SetPhiRoundness(1.1)
        superquadric_source.SetThetaRoundness(.2)

        # Create a mapper and actor
        superquadric_mapper = vtk.vtkPolyDataMapper()
        superquadric_mapper.SetInputConnection(superquadric_source.GetOutputPort())

        superquadric_actor = vtk.vtkActor()
        superquadric_actor.SetMapper(superquadric_mapper)

        scene_renderer = vtk.vtkRenderer()
        render_window = vtk.vtkRenderWindow()

        # Set up the render window and renderers such that there is
        # a background layer and a foreground layer
        background_renderer.SetLayer(0)
        background_renderer.InteractiveOff()
        scene_renderer.SetLayer(1)
        render_window.SetNumberOfLayers(2)
        render_window.AddRenderer(background_renderer)
        render_window.AddRenderer(scene_renderer)

        render_window_interactor = vtk.vtkRenderWindowInteractor()
        render_window_interactor.SetRenderWindow(render_window)

        # Add actors to the renderers
        scene_renderer.AddActor(superquadric_actor)
        background_renderer.AddActor(image_actor)

        # Render once to figure out where the background camera will be
        render_window.Render()

        # Set up the background camera to fill the renderer with the image
        origin = image_data.GetOrigin()
        spacing = image_data.GetSpacing()
        extent = image_data.GetExtent()

        camera = background_renderer.GetActiveCamera()
        camera.ParallelProjectionOn()

        xc = origin[0] + 0.5 * (extent[0] + extent[1]) * spacing[0]
        yc = origin[1] + 0.5 * (extent[2] + extent[3]) * spacing[1]
        # xd = (extent[1] - extent[0] + 1) * spacing[0]
        yd = (extent[3] - extent[2] + 1) * spacing[1]
        d = camera.GetDistance()
        camera.SetParallelScale(0.5 * yd)
        camera.SetFocalPoint(xc, yc, 0.0)
        camera.SetPosition(xc, yc, d)

        # Render again to set the correct view
        render_window.Render()

        # Interact with the window
        render_window_interactor.Start()

    if __name__ == '__main__':
        main()