Jump to content


Photo

Multi monitor slide show


  • Please log in to reply
62 replies to this topic

#1 aliali

aliali

    Titan

  • Super Hero
  • 24,314 posts

Posted 12 January 2017 - 02:30 PM

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, 12 January 2017 - 02:31 PM.

Of course you are my bright little star,

I've miles and miles of files pretty files of your forefather's fruit,

and now to suit our great computer. You're magnetic ink.


#2 Jeruselem

Jeruselem

    Guru

  • Atomican
  • 13,194 posts
  • Location:Not Trump-Land

Posted 12 January 2017 - 02:36 PM

AMD Eyefinity tech supports 6 monitors

http://support.amd.c...us/search/faq/7

 

nVidia NVS 810 supports 8 monitors

http://www.nvidia.co...t-overview.html


Edited by Jeruselem, 12 January 2017 - 03:06 PM.

Cortana at your service


#3 Rybags

Rybags

    Immortal

  • Super Hero
  • 34,290 posts

Posted 12 January 2017 - 03:11 PM

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.



#4 Jeruselem

Jeruselem

    Guru

  • Atomican
  • 13,194 posts
  • Location:Not Trump-Land

Posted 12 January 2017 - 03:15 PM

I checked Matrox video cards can do the same as well

http://www.matrox.co.../c-series/c680/

 

So you have a choice to Matrox, AMD and nVidia video cards.


Cortana at your service


#5 aliali

aliali

    Titan

  • Super Hero
  • 24,314 posts

Posted 12 January 2017 - 03:33 PM

AMD Eyefinity tech supports 6 monitors

http://support.amd.c...us/search/faq/7

 

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


Of course you are my bright little star,

I've miles and miles of files pretty files of your forefather's fruit,

and now to suit our great computer. You're magnetic ink.


#6 Master_Scythe

Master_Scythe

    Titan

  • Hero
  • 19,694 posts
  • Location:QLD

Posted 12 January 2017 - 03:38 PM

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.schlackma...rams/slideshow/

?


Wherever you go in life, watch out for Scythe, the tackling IT support guy.

"I don't care what race you are, not one f*cking bit, if you want to be seen as a good people, you go in there and you f*ck up the people who (unofficially) represent you in a negative light!"


#7 Jeruselem

Jeruselem

    Guru

  • Atomican
  • 13,194 posts
  • Location:Not Trump-Land

Posted 12 January 2017 - 03:54 PM

 

AMD Eyefinity tech supports 6 monitors
http://support.amd.c...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....on™-RX-480/76

Eyefinity supported!


Edited by Jeruselem, 12 January 2017 - 03:59 PM.

Cortana at your service


#8 aliali

aliali

    Titan

  • Super Hero
  • 24,314 posts

Posted 12 January 2017 - 05:16 PM

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.


Of course you are my bright little star,

I've miles and miles of files pretty files of your forefather's fruit,

and now to suit our great computer. You're magnetic ink.


#9 SquallStrife

SquallStrife

    Really knows where his towel is

  • Atomican
  • 17,919 posts

Posted 12 January 2017 - 06:41 PM

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, 12 January 2017 - 07:03 PM.

SyDjDDk.png [retro swim] | AzpUvwG.png @retroswimau | q5O6HgO.png +RetroSwim
四時半を待っています!

#10 Jeruselem

Jeruselem

    Guru

  • Atomican
  • 13,194 posts
  • Location:Not Trump-Land

Posted 12 January 2017 - 06:53 PM

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.

Cortana at your service


#11 Rybags

Rybags

    Immortal

  • Super Hero
  • 34,290 posts

Posted 12 January 2017 - 08:37 PM

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.



#12 Dasa

Dasa

    Guru

  • Super Hero
  • 14,783 posts

Posted 12 January 2017 - 09:42 PM

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, 12 January 2017 - 09:45 PM.

Silverstone TJ08-EW 6700k@4.7 1.375v - Z170-GENE - 2x8g 3866 16-16-16 - 1070@ 2100\9600MHz  -Samsung 830 64G, Sandisk Ultra II 960G, WD Green 3tb - Seasonic XP1050 - Dell U2713 - Pioneer Todoroki 5.1 Apogee Drive II - EK VGA-HF Supreme  - Phobia 200mm Rad - Silverstone AP181 Project Darkling
3770k vs 6700k RAM Scaling, HT vs RAM, Arma III CPU vs RAM, Thief CPU vs RAM
Parts Guide


#13 aliali

aliali

    Titan

  • Super Hero
  • 24,314 posts

Posted 12 January 2017 - 09:49 PM

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.


Of course you are my bright little star,

I've miles and miles of files pretty files of your forefather's fruit,

and now to suit our great computer. You're magnetic ink.


#14 @~thehung

@~thehung

    Guru

  • Hero
  • 8,464 posts

Posted 12 January 2017 - 09:53 PM

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, 12 January 2017 - 09:55 PM.

no pung intended

#15 aliali

aliali

    Titan

  • Super Hero
  • 24,314 posts

Posted 13 January 2017 - 07:32 AM


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.


Of course you are my bright little star,

I've miles and miles of files pretty files of your forefather's fruit,

and now to suit our great computer. You're magnetic ink.


#16 SquallStrife

SquallStrife

    Really knows where his towel is

  • Atomican
  • 17,919 posts

Posted 13 January 2017 - 09:27 AM

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.
SyDjDDk.png [retro swim] | AzpUvwG.png @retroswimau | q5O6HgO.png +RetroSwim
四時半を待っています!

#17 Master_Scythe

Master_Scythe

    Titan

  • Hero
  • 19,694 posts
  • Location:QLD

Posted 13 January 2017 - 10:00 AM

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.


Wherever you go in life, watch out for Scythe, the tackling IT support guy.

"I don't care what race you are, not one f*cking bit, if you want to be seen as a good people, you go in there and you f*ck up the people who (unofficially) represent you in a negative light!"


#18 SquallStrife

SquallStrife

    Really knows where his towel is

  • Atomican
  • 17,919 posts

Posted 13 January 2017 - 10:12 AM

        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, 13 January 2017 - 10:17 AM.

SyDjDDk.png [retro swim] | AzpUvwG.png @retroswimau | q5O6HgO.png +RetroSwim
四時半を待っています!

#19 SquallStrife

SquallStrife

    Really knows where his towel is

  • Atomican
  • 17,919 posts

Posted 13 January 2017 - 01:11 PM

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, 13 January 2017 - 01:48 PM.

SyDjDDk.png [retro swim] | AzpUvwG.png @retroswimau | q5O6HgO.png +RetroSwim
四時半を待っています!

#20 aliali

aliali

    Titan

  • Super Hero
  • 24,314 posts

Posted 13 January 2017 - 01:48 PM

 

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.


Of course you are my bright little star,

I've miles and miles of files pretty files of your forefather's fruit,

and now to suit our great computer. You're magnetic ink.





0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users