Jump to content
Sign in to follow this  
aliali

Multi monitor slide show

Recommended Posts

Been asked to look at setting up a system where a slide show can be displayed across 6 monitors or TVs all controlled from one PC.

So set up is

A total of 6 screens, 5 at around 40 to 42" and one 60" to 72" arranged around 3 walls with the big screen on one wall by itself so it can also be used to demonstrate windows things in training courses.
Now it gets complex.
The boss would also like to run a "slide show" of local artists products, photos and local attractions across all screens.

But it's not that simple (it never is) the boss wants it so that screen one displays image 1, image 1 then moves to screen two and image 2 is then displayed on screen one. Image 1 then moves to screen three followed by image 2 moving to screen two and screen one now displays image 3. Images progress around the screens until they finish and then go back in to the rotation (assuming more than six images in the slide show).

So a slide show progressing in sequence around all screens.

Also need to be able to stop the slide show to use monitor six (the 60in plus one) for windows training.

Budget is 10K all up including monitors, computer, wall mounts and of course my labour.

 

So anyone got ideas on how to do this sort of stuff? Suggested software and hardware? Running six displays off one PC is going to be the first hurdle IMO.

Edited by aliali
  • Like 1

Share this post


Link to post
Share on other sites

A quick look at my IrfanView - the slide show does have numerous settings. It seems to even support text files with filenames of pics to show and can save slideshows as Exe or Scr.

Then the trick would be starting multiple instances forced to individual monitors, something like a staggered startup would likely be sufficient to fudge the desired scrolling effect, or individual pic batch descriptors for each monitor in the configuration.

 

It might be a case of using multiple bits of software to get it all going. I remember years ago trying to setup the remote for my capture card to do all sorts of automated stuff and came across HIP and Girder. Such programs could come in useful here.

Also worth looking at could be stuff like nView and the seldom used desktop "enhancements" that nVidia and AMD graphics drivers often include.

Share this post


Link to post
Share on other sites

I'd run X number of copies of Ifranview.

I'd make sure all images are numbered as expected.

Then start them all one image after the other (ifranview can 'pause' slideshow).

Then unpause them all at once.

 

So long as this is a 'set and forget' task, outside of replacing the numbered images in the folder, its not too bad.


http://www.schlackman.org/programs/slideshow/

?

Share this post


Link to post
Share on other sites

 

AMD Eyefinity tech supports 6 monitors

http://support.amd.com/en-us/search/faq/7

Seems to be a rather old list as there is no Rx series on there.

Very true, but that link came off the amd web site. Slack FAQ editors

 

RX-480

http://products.amd.com/en-us/search/Desktop-Graphics/Radeon%e2%84%a2-RX-Series/Radeon%e2%84%a2-Powered-by-Polaris-Tech/Radeon%e2%84%a2-RX-480/76

Eyefinity supported!

Edited by Jeruselem

Share this post


Link to post
Share on other sites

These https://www.brightsign.biz/ seem to be an elegant solution, although pricey. Need one unit per screen though.

 

Jeruselem

had a look at the cards with 6 DP outputs and they look promising except there seems to be a 3 metre cable length limit, although possibly longer for lower resolutions like 1920x1080.

Share this post


Link to post
Share on other sites

Yep, with eyefinity and [nVidia's name for the same thing], there's no longer a need to invest in a purpose-made multi-head graphics card. Matrox's current 8-head solution starts over $1000.

 

I'm pretty disappointed that y'all haven't come up with something a bit more robust than "start a bunch of image viewers in slideshow mode and unpause them all at the same time". That's suuuuuuuuuuper ghetto!! You want a solution where the applications displaying the images are stateful, and reflect the status of one another.

 

I found a PowerShell script that can display an image, throwing in some logic to read the image name from a text file and keep 6 instances in sequence shouldn't be too difficult.

 

Psuedocode would be something like:

 

Main include file:

 

Stupid forum discarded the other two bits of psuedocode.

 

But basically, you have a control program that updates an index number every x seconds, and a series of instances with a "screen id" number, that read that index number and add their id to it (thus receiving a series of sequential numbers), and using that to get the image filename from a list to display it.

Edited by SquallStrife

Share this post


Link to post
Share on other sites

Video cables kinda max out at 10m, due to the high bandwidth required for raw video output. Any longer, and you need video to cat6 extenders which are a bit hit and miss. We have used those but they aren't good for high res.

Share this post


Link to post
Share on other sites

There's other options for longer distances.

 

Another approach completely though fraught with it's own issues might be to do it over a DLNA/uPnP setup. Have 1 or 2 actual monitors then the remainder as part of a local network.

Then use control point software to show pics, videos, music, whatever on the other TVs.

That said though it means either smart TVs or Android dongles at the client side. Though dongles can be gotten pretty cheap.

Share this post


Link to post
Share on other sites

there expensive but there is long dp\hdmi cables available

 

Alogic DisplayPort Cable Ver 1.2 7.5m\10m $42\$75

ALOGIC 30m HDMI Cable with Active Booster $129 <may need dp to hdmi adapters depending on display output

 

you can typically also use the igp outputs at the same time as the gpu some new ones come with three digital outputs although how well this would worth with the requirements im not sure

 

im using a regular 10m hdmi cable to our 1080p60 projector without a problem other than a mild electric shock if you touch the end that the projector seems to feed into it

makes sparks fly when plugging it in to the amp

Edited by Dasa

Share this post


Link to post
Share on other sites

Yep, with eyefinity and [nVidia's name for the same thing], there's no longer a need to invest in a purpose-made multi-head graphics card. Matrox's current 8-head solution starts over $1000.

 

I'm pretty disappointed that y'all haven't come up with something a bit more robust than "start a bunch of image viewers in slideshow mode and unpause them all at the same time". That's suuuuuuuuuuper ghetto!! You want a solution where the applications displaying the images are stateful, and reflect the status of one another.

 

Ye that's not going to fly, the setup needs to be fairly idiot proof and easy to run and change as I don't want to be on the phone every day trying to sort out basic issues.

Share this post


Link to post
Share on other sites

MS's solution may be super ghetto LOL, but sometimes ghetto is enough! for example, if it truly is 'set and forget'

 

but some stateful behaviour is desirable. you would want to at least have master control to pause and resume. which may not require any scripting.

 

 

my first thought is, assuming Eyefinity or Surround work as i expect they do, just use a slideshow program (FastStone is pretty cool) to display ONE image on ALL monitors at once; where each image is the combined width of 5 pics sewn together horizontally (eg. [5 x 1920] x 1080) previously in photoshop etc.

 

so your massive spanned fullscreen desktop would cycle through your pictures thusly: 12345, 23456, 34567, 45678, etc. ....finishing at,say, X1234.

 

could work, assuming your slideshow program didnt shit itself at weird resolutions, but perhaps a little inflexible if you want to add or remove images last minute.

 

 

also, check out the documentation for this old (2004) thing: Slideshow -- which claims multimonitor support and is controllable from the command line (it switches them all at once, and guarantees a different image on each screen, but is maddeningly unclear about whether it creates a true round-robin thing)

Edited by @~thehung

Share this post


Link to post
Share on other sites

my first thought is, assuming Eyefinity or Surround work as i expect they do, just use a slideshow program (FastStone is pretty cool) to display ONE image on ALL monitors at once; where each image is the combined width of 5 pics sewn together horizontally (eg. [5 x 1920] x 1080) previously in photoshop etc.

 

so your massive spanned fullscreen desktop would cycle through your pictures thusly: 12345, 23456, 34567, 45678, etc. ....finishing at,say, X1234.

 

could work, assuming your slideshow program didnt shit itself at weird resolutions, but perhaps a little inflexible if you want to add or remove images last minute.

 

 

also, check out the documentation for this old (2004) thing: Slideshow -- which claims multimonitor support and is controllable from the command line (it switches them all at once, and guarantees a different image on each screen, but is maddeningly unclear about whether it creates a true round-robin thing)

That's not a bad idea about stitching the images together to suit the combined screen res, and it doesn't have to be combined width.

If the computer thinks the screens are two rows of three just arrange the images in the same layout to make the super image and then position the screens where you want.

Share this post


Link to post
Share on other sites

Ye that's not going to fly, the setup needs to be fairly idiot proof and easy to run and change as I don't want to be on the phone every day trying to sort out basic issues.

Dicking about with slideshow programs doesn't strike me as "idiot proof".

 

I know how to display an image full-screen with C#, and I know how to make a form appear on a specific screen.

 

I think I can put something together for you over the weekend. Watch this space.

  • Like 1

Share this post


Link to post
Share on other sites

Video cables kinda max out at 10m, due to the high bandwidth required for raw video output. Any longer, and you need video to cat6 extenders which are a bit hit and miss. We have used those but they aren't good for high res.

 

I've done a lot of 4k home theater installs, with HDMI runs well over 15m without a booster.

You're right, you start to RISK drop-outs at 10m+ but Its super uncommon until you breach15m IMO, and We've even done a passive 20m+ run with a good quality, big gauge wiring, HDMI (from CHORD in europe).

 

my first thought is, assuming Eyefinity or Surround work as i expect they do, just use a slideshow program (FastStone is pretty cool) to display ONE image on ALL monitors at once; where each image is the combined width of 5 pics sewn together horizontally (eg. [5 x 1920] x 1080) previously in photoshop etc.

 

so your massive spanned fullscreen desktop would cycle through your pictures thusly: 12345, 23456, 34567, 45678, etc. ....finishing at,say, X1234.

 

could work, assuming your slideshow program didnt shit itself at weird resolutions, but perhaps a little inflexible if you want to add or remove images last minute.

 

 

also, check out the documentation for this old (2004) thing: Slideshow -- which claims multimonitor support and is controllable from the command line (it switches them all at once, and guarantees a different image on each screen, but is maddeningly unclear about whether it creates a true round-robin thing)

That's not a bad idea about stitching the images together to suit the combined screen res, and it doesn't have to be combined width.

If the computer thinks the screens are two rows of three just arrange the images in the same layout to make the super image and then position the screens where you want.

 

 

Problem is, that knocks out the whole slideshow when you want to use the 'middle screen'.

 

This is starting to sound like one of those instances where you need to talk to your boss about realities.

I'd suggest an 'odd' number of screens (5 or 7).

That budget should allow for two unique NUC's.

A copy of SYNERGY (so one keyboard and mouse can freely move between PC's https://symless.com/synergy/).

and a high quality wireless desktop solution.

 

[ pc1 ] [ pc1 ] [ pc2 ] [ pc1 ] [ pc1 ]

 

Work on either stitching, or trying that little app I linked you to above to slideshow the outside monitors, and leave the middle showing company logos, internal photos, motivational cat posters, whatever. and have the 'outside' monitors cycling in order.

 

It's easy to ghetto a solution if he doesn't want to touch it.... but you have a pretty decent case to modify the scope of this project based on an ease of use stand point.

Share this post


Link to post
Share on other sites

        private void Form1_Load(object sender, EventArgs e)
        {
            this.FormBorderStyle = FormBorderStyle.None;
            this.WindowState = FormWindowState.Minimized;

            int screencount = Screen.AllScreens.Count();

            FormCollection = new Form[screencount];
            for (int i = 0; i < screencount; i++)
            {
                FormCollection[i] = new Form2();
                FormCollection[i].StartPosition = FormStartPosition.Manual;
                FormCollection[i].FormBorderStyle = FormBorderStyle.None;
                setFormLocation(FormCollection[i], Screen.AllScreens[i]);
                FormCollection[i].Show();
                FormCollection[i].TopMost = true;
            }
        }

        private void setFormLocation(Form form, Screen screen)
        {

            Rectangle bounds = screen.Bounds;
            form.SetBounds(bounds.X, bounds.Y, bounds.Width, bounds.Height);

        }


 

Places a full screen blank form (called Form2) on each display, just need to get the image-showing part working.

 

This also unambiguously puts things in the same order as Windows puts the screens.

Edited by SquallStrife
  • Like 1

Share this post


Link to post
Share on other sites

OK, pre alpha version. Scans "c:\temp" for JPG and PNG files, sorts the list alphabetically, displays the first image on the first monitor, moves it "across" one, puts next image on first monitor, and so forth.

 

New Windows Forms application. Two forms, Form1 and Form2.

 

Form 1 has a single button called "button1". The layout of Form1 isn't important.

 

Form 2 has the BackColor set to black, and two buttons, "button1" and "button2", and a PictureBox control called "pictureBox1". button1's caption will be changed at runtime, button2 should read "Minimize this window". Both buttons should have visible=false. Layout of Form2 mostly isn't important (it's altered at runtime), but the buttons should be smallish and in the top left like so:

 

WpQSmks.png

 

Code:

 

Form1.cs

using System;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        Form[] FormCollection;
        int screencount;
        int imagecount;
        int[] currentimages;
        IOrderedEnumerable<string> imagelist;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.Text = "Multi-Monitor Slideshow Control";

            // Index images in c:\temp alphabetically by name
            imagelist = from file in Directory.GetFiles(@"c:\temp").Where(s => s.ToLower().EndsWith(".jpg") || s.ToLower().EndsWith(".png"))
                        orderby file ascending
                        select file;

            imagecount = imagelist.Count();
            
            // Set up windows
            screencount = Screen.AllScreens.Count();
            FormCollection = new Form[screencount];
            for (int i = 0; i < screencount; i++)
            {
                FormCollection[i] = new Form2();
                FormCollection[i].Text = "Control for screen " + i.ToString();
                FormCollection[i].StartPosition = FormStartPosition.Manual;
                FormCollection[i].FormBorderStyle = FormBorderStyle.None;
                setFormLocation(FormCollection[i], Screen.AllScreens[i]);
                FormCollection[i].Show();
                FormCollection[i].TopMost = true;
                FormCollection[i].Controls["button1"].Text = "Restore screen " + i.ToString();
                FormCollection[i].Controls["pictureBox1"].Top = 0;
                FormCollection[i].Controls["pictureBox1"].Left = 0;
                FormCollection[i].Controls["pictureBox1"].Height = FormCollection[i].Height;
                FormCollection[i].Controls["pictureBox1"].Width = FormCollection[i].Width;
                ((PictureBox)FormCollection[i].Controls["pictureBox1"]).SizeMode = PictureBoxSizeMode.Zoom;
            }

            // Set up initial state
            currentimages = new int[screencount];
            currentimages[0] = 0; // zeroeth image on zeroeth screen

            for (int i = 1; i<currentimages.Length; i++)
            {
                currentimages[i] = -1; // No image on other screens
            }

            ((PictureBox)FormCollection[0].Controls["pictureBox1"]).ImageLocation = imagelist.ElementAt(0);
            ((PictureBox)FormCollection[0].Controls["pictureBox1"]).Load();

            // Initialise timer

            Timer maintimer = new Timer();
            maintimer.Tick += timeraction;
            maintimer.Interval = 5000;
            maintimer.Start();

        }

        private void setFormLocation(Form form, Screen screen)
        {
            Rectangle bounds = screen.Bounds;
            form.SetBounds(bounds.X, bounds.Y, bounds.Width, bounds.Height);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void timeraction(object sender, EventArgs e)
        {
            // shuffle image ID's along.
            for (int i = currentimages.Count() - 1; i > 0; i--)
            {
                currentimages[i] = currentimages[i - 1];
            }
            currentimages[0]++;
            if(currentimages[0] > (imagecount - 1)) { currentimages[0] = 0; }

            // Update images
            for(int i = 0; i < screencount; i++)
            {
                if (currentimages[i] != -1)
                {
                    ((PictureBox)FormCollection[i].Controls["pictureBox1"]).ImageLocation = imagelist.ElementAt(currentimages[i]);
                    ((PictureBox)FormCollection[i].Controls["pictureBox1"]).Load();
                }
            }
        }
    }
}
Form2.cs:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form2 : Form
    {
        bool showing_image = true;
        Rectangle windowdims;

        public Form2()
        {
            InitializeComponent();
        }
        
        private void Form2_Click(object sender, EventArgs e)
        {
            if (showing_image)
            {
                windowdims = this.Bounds;
                pictureBox1.Visible = false;
                button1.Visible = true;
                button2.Visible = true;

                this.Width = 300;
                this.Height = 50;
                this.FormBorderStyle = FormBorderStyle.FixedSingle;
                this.TopMost = false;
                this.ControlBox = false;
                this.Click -= Form2_Click;
                showing_image = false;
            }
            else
            {
                pictureBox1.Visible = true;
                button1.Visible = false;
                button2.Visible = false;
                this.FormBorderStyle = FormBorderStyle.None;
                this.Bounds = windowdims;
                this.TopMost = true;
                this.Click += Form2_Click;
                showing_image = true;
            }
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            Form2_Click(sender, e);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Minimized;
        }
    }
}
Launching the applications puts it into the "normal" mode of operation, the images display sequentially across all available displays.

 

To "take control" of a display, simply use the mouse to click on the required screen somewhere. The image will be hidden, and a small (minimise-able) dialog appears to let you restore the image later.

 

Things to fix:

-The program might crash if you try to close one of the windows through the taskbar, I think. Need to add something to the FormClosing event.

-The program will probably crash if the target folder contains no JPG or PNG images

-Path is hardcoded

-Interval is hardcoded

Edited by SquallStrife

Share this post


Link to post
Share on other sites

 

This is starting to sound like one of those instances where you need to talk to your boss about realities.

Ye she is asking rather a lot IMO.

 

I've done a lot of 4k home theater installs, with HDMI runs well over 15m without a booster.

Max run would be about 5 metres, possibly six at a stretch.

 

 

 

New Windows Forms application. Two forms, Form1 and Form2.

Please forgive an old farts ignorance but all this has gone totally over my head Squall. Have no idea on how this is implemented or anything. I just do fairly standard domestic and small business computer repairs for a living.

Never learnt programming, coding, etc etc.

Share this post


Link to post
Share on other sites

Oky doky, I'll compile it for ya then.

 

Let me fix the last few items so it's a bit more resilient and configurable.

Share this post


Link to post
Share on other sites

That's not a bad idea about stitching the images together to suit the combined screen res, and it doesn't have to be combined width.

If the computer thinks the screens are two rows of three just arrange the images in the same layout to make the super image and then position the screens where you want.

 

 

hmm, i misread the OP. all screens doing the slideshow.

 

gotta say 6 is a wacky number. i would think that 5 would be ideal — one big ass screen with two on the walls either side...

 

seems its possible to daisy chain from 2 display ports

 

mst.jpg

 

but not sure about cable run lengths: http://multimonitorcomputer.com/solved/images/daisy-chaining-displayport-how-to.jpg

Share this post


Link to post
Share on other sites

https://dl.dropboxusercontent.com/u/11176711/WindowsFormsApplication2.zip

 

Source code included for Visual Studio 2015 (Express or community editions are fine).

 

Simply copy the "SlideShowDealie.exe" in the zip file to the machine and run it.

 

Quick usage notes:

 

- Defaults to c:\temp. If no images exist there, it will ask you to pick a new folder. Can also change from main dialog

- Defaults to 5 seconds delay, can be adjusted in main dialog

- Only scans for JPG and PNG images.

- Both of these adjustments will be remembered across sessions

- Clicking on any monitor will "free it up" and show the little floating window to allow you to "restore" that display later.

- You /should/ be prevented from closing windows in such a way that the program will crash. You need to close the "main" window, so everything can be despawned cleanly.

- Needs the usual Windows "multi monitor" setup to work. It won't work if you have it configured as a virtual single giant monitor.

- Needs .NET framework 4.5

 

I have no idea if there are any earth-shattering bugs. I only tested it for a few minutes. Use it at your own risk! :)

Share this post


Link to post
Share on other sites

Simply copy the "SlideShowDealie.exe" in the zip file to the machine and run it.

 

Voted best application name ever.

 

Lets brainstorm a wide range of 'Dealies'

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×