peterheid
Goto Top

Hochzeitsspiel: Fotos aufdecken

Für eine Hochzeit möchte ich Bilder mit einem Beamer an die Wand werfen. Der ist ohnehin vorhanden. Das klappt auch so - rein technisch.

Jetzt möchte ich verschiedene Bilder an die Wand werfen und diese nur Stück für Stück aufdecken, damit diese erraten werden können.

Mit Excel klappt das. Jedes Bild auf eine Tabelle & dann mit dem Tastatur-Shortcut jeweils die nächste Tabelle anwählen, welche dann das weiter aufgedeckte Foto präsentiert.

Jedoch ist das schon für mehre Fotos recht aufwändig. Der Gag an der Sache soll sein, dass die Fotos erst wenige Minuten vor dem Spiel erstellt werden. Da bleibt dann nur wenig Zeit um die gesamten Exceltabellen so zu erstellen.

Gibt es für so etwas ein fertiges Tool? Wo ich quasi meine Fotos einfügen kann und die dann nach und nach aufgedeckt werden? Das soll aber in Etappen passieren nicht einfach eine Animation und das Bild ist dann da.

Content-ID: 5490328352

Url: https://administrator.de/contentid/5490328352

Ausgedruckt am: 21.11.2024 um 21:11 Uhr

5175293307
Lösung 5175293307 19.01.2023 aktualisiert um 22:10:10 Uhr
Goto Top
Crusher79
Crusher79 19.01.2023 um 22:11:30 Uhr
Goto Top
Hallo,

mit Excel? Ich kenne keine Software. Wenn es immer die gleichen Ausschnitte sein dürfen ggf. mit Tool mergen?

Du hast ka 20 Masken, die es abdecken. Die auf die 20 Einzelbilder legen und fertig. Wenn die Transparent sind, scheint über Alpha Kanal immer nur der Bereich durch.

Batch Merge? Würd es mal googlen. PowerShell wäre auch denkbar. Dann geht es vollautomatisch. Der Nachteil wäre nur, dass die Ausschnitte bei jeden Bild gleich sind. Bis alles aufgedeckt ist. Könnte man mit 2-3 Variationen etwas auflockern.

Da du am Ende 20 Einzelbilder mit Ausschnitten hast, kannst du es mit jedem Tool irgendwie steuern. selbst die Windows Foto Show kann man ja so durchscrollen. Oder eben alles schnell auf Powerpoint ziehen.

Die Masken kannst du ja vorher in Ruhe erstellen. Durchnummerieren und fertig. Mergen von 2 Dateien mal Anzahl x sollte in ein paar Sekunden durch sein.

mfg Crusher
em-pie
em-pie 19.01.2023 um 22:19:17 Uhr
Goto Top
Moin,

Nimm PowerPoint.

Nen Haufen weißer Felder, die als Animation „Ausblenden“ bei klick haben.

Das aufzudeckende Foto kommt in den Hintergrund und kann ja schnell eingefügt werden.

Die Aufdeckreihenfolge kannst du für jede Folie ja dann ändern…
Crusher79
Crusher79 19.01.2023 aktualisiert um 22:27:50 Uhr
Goto Top
Zitat von @em-pie:

Moin,

Nimm PowerPoint.

Der Nachteil ist nur, dass man PP braucht. Kackt an so einen Abend der Lappi ab, war es das.

Mit 20 Einzelbildern könnte jeder der den Beamer erreicht die Präsentation anstoßen. Viele Beamer haben ja auch WLAN und Einzelbildmodus sollte kein Problem sein. Hab nur noch nie einen mit Handy verbunden.

Naja wenn die Technik versagt könnte er ja noch umschwenken: Der Maler aus Paris. Oder die Glocken von Rom... face-big-smile


Nein nochmal zurück: Windows Update, PP, Bluescreen. Gut viele haben ja Laptops. Ggf. wäre er den Abend nicht der Einzige. Einbilder hätte nur den Vorteil dass man mit den trivialsten Bildbetrachtern das im Vollbild an die Wand bekommt.


Aber dennoch +1 für PP.

PS: Mein Beispiel hinkt aber auch. Er braucht ja ein Gerät um die Bilder zu erstellen... Also doch wieder "Glocken von Rom"
em-pie
em-pie 20.01.2023 um 07:24:54 Uhr
Goto Top
Der Nachteil ist nur, dass man PP braucht. Kackt an so einen Abend der Lappi ab, war es das.
Und wenn die Glühlampe im Beamer knackt, war es das auch…
Man kann ja nen zweiten Laptop einpacken.
ElCativoGER
ElCativoGER 20.01.2023 um 12:20:53 Uhr
Goto Top
Alternativ wäre eine Diashow mit Screenshots möglich.
EIN BISSCHEN UMSTÄNDLICH.. aber wäre eine Notlösung, wenn PP nicht geht

;)
colinardo
Lösung colinardo 22.01.2023 aktualisiert um 18:17:44 Uhr
Goto Top
Servus.
Mal schnell mit Powershell ne kleine Basis-App zusammengelötet wenn man Powerpoint nicht nutzen mag. Kann sich dann jeder nach Gusto anpassen/erweitern.

screenshot

screenshot

back-to-topScript

# hide console
Add-Type -Memberdefinition '[DllImport("user32.dll")]public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);' -Name window -Namespace W32  
[void][W32.Window]::ShowWindow((Get-Process -id $pid).MainWindowHandle, 0)

# generate main form
function GeneratePuzzleForm {
    param(
        # define main window title
        [string]$windowtitle = 'Image Puzzle'  
    )
    Add-Type -A System.Windows.Forms
    Add-Type -A System.Drawing
    Add-Type –MemberDefinition '  
        [DllImport("Shell32.dll", EntryPoint = "ExtractIcon")]public static extern int ExtractIcon(IntPtr hInstance,string sFile, int iIndex);  
        [DllImport("Shell32.dll", EntryPoint = "ExtractIconExW", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]public static extern int ExtractIconEx(string sFile, int iIndex, out IntPtr piLargeVersion, out IntPtr piSmallVersion, int amountIcons);  
    ' -name icon -namespace w32 -EA SilentlyContinue  

    $global:image = $null
    $global:partimage = $null
    $global:imagedivider = 8
    $global:graphics = $null
    $global:partsize_h = 0
    $global:partsize_v = 0
    $global:pos = 0
    $global:timerinterval = 1000
    
    # create some icons
    $icon_play = [System.Drawing.Image]::FromStream((New-Object System.IO.MemoryStream (,([Convert]::FromBase64String('iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAA3NCSVQICAjb4U/gAAAB1FBMVEUAAADJ3eWxx9wARIRYhrGIqccAE2OHqcbS5OoYVpB9osCBpMKxx9qduNFQgaz///9aiLKQr8uQrsmOrcjh6fLb5/G0yNyJqcgAMnbN3+cfWZB1lLaHqcWFqMXQ3uzj7vXd6vLL2+qnwNd3ncCUs88AACt/o8J6oMHP3+vU4+/E2OfM4e3I3Omyyt6Ts81cibJwkrVwmLtrlLnC1eXG3Oq30uOty+CgxNmnyN6lw9mYt9GDpcQ3aJxukbZsk7llj7a60eG00eKew9qbwNiNttF8qsp7p8eIrMmOrMmMqcZvkLRfibZrlbhkj7WuydylyN2RudOCr813qMlwocRklblai7R9osN9mLdffaRqlLhijrWmw9qUutV+rcx2qclonMBZj7hllbt4mrtlhaxLbJhUYI1slbhgjbOZudODrs5xocRgk7pfkrhzmr1xkLNWdZ81VYdmhKtKa5VulLhhirGNr8xsmb1ejbZrlbt1lbdjgKZGZpQQPHdylLdghqx4m71kjbR1lbhtia1Vcp0oSXxrh6gAHlyAn75uhqplfKN9mbp1j7FjfqQ6WoonS4EOOnZld51hdJpthKhTb5kFK2hgeaAAACGLobwRMmwAA00UN3EoTYERaSCMAAAAnHRSTlMAAQcEAgELCAIBCWPunC4DCAMMhf//+HoLBgQBC33+6///1U8JAQyB//n/8///sDAGC3//8P//+/j/9IMOAQyA//b/+P//9P//yioBC37/8v//+/3/+uz/ZQyA//X++P/+9f//dgILf//x///3/v++MgYBDIH/+Pz2/+hlBgt9/u3//6UeBgQBDIT//9NGCQIJZ+twCwgBAQEKBgPejdSuAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA7UlEQVR42jWPZVNCARBFj91gi1godiKKrdiK3Z3YAiYWBih2YAf6Z30P9H7ae+bs7CyAB55e4A0+/MUX/MA/wN0CCQoOkSANhTAXCCciMio6RkasHOIEEE9CYpIiOUUJqWmikU5GZlZ2Tm5efgGoBFCIuqhYU1JaVl5RWUU11KCtratvaGxqbmnVtbVDB51d3T29ff0Dg0PDI8LKKGPjE5NT0zOz+rl5FmCRpeWVVYPRtLa+weYWbGPe2d3bP7AcwpF49pgTq+30zH7OxSVXArjm5vbu/gEc8CgaTzy/vL7x/sHn1/+3TviGH9f8C5SiLzsD+pIlAAAAAElFTkSuQmCC')))))  
    $icon_stop = [System.Drawing.Image]::FromStream((New-Object System.IO.MemoryStream (,([Convert]::FromBase64String('iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAA3NCSVQICAjb4U/gAAAC0FBMVEUAAAAqAAD///+ffX+7pqjFpqfPsLHPra/CnqCvm55/Z2v///8AAABqUlTUwsxSAADHr7DZuLnnr6/vqKnumJfsjY3tjIzji4vQm5ylkZQoAABIRETl399uKCPZwL/ww8PxpaTvoJ/ok5PnjY3kg4PhcXHiZWTlVlXdhYasmJsvAADR7e7Cp6jvwcHtmprpnZ3ojIzngoLlc3PjZmbhYWHfVFTaVlbeMS/afX6gjI6YdXbVsrLwn5/nmJjskJDolJTljIzjg4Pgenrfb2/aZ2bgTEzXTU7jPDzGj5BwWly0lpjmp6jskI/mh4flg4P7+Pn7/v72+Pjw9vbt7u7j7u7UT0/cOzzaODfbbG6Yhom7k5TumJnjfX3ld3fidXX48fH08/Pv6+vo6Oji3d3a29vPNDTXHBzRHRzdNDWhd3rEl5rsgoHhcHDkZ2fdYmLy7ezv8/Po6eni5ubc29vW29vOOzvZGxvSKirgKiuqd3nCkZPpbm/cZGTeSEjVOzvq4uLi3t7c3NzW0dHQ09PPPT3aISHTLy/hNTSre360hIbnb3DXPT3XKivUMTHn4uLj6enc3t7W3NzPz8/L0tLSQ0PbLy/WMTHiTEyee36jhYfaZmfVGxvVIiLRJSXazc3Z0NDUyMjQyMnNwMDKycnTQ0PcNzfcNTTZb2+KeXx/YGLEf4HcFBPPJSXYHR3NHh7PIyPPKirRLy/UMjLSNTXgPj7XR0fnQ0O8kJJeQUOfgYTTaWvXAADQJyfYJyfaLS3bKyvcMDDdPDzeQkLYSUnhMjLbkJGKd3kAAACY2tsrAACoiozVb3DcGxvWGhnTIyPVMTHXNzfWNTXbOTnlSEjflpeai4wbAADb//8eSUe1x8Y5AACgf4DGh4nYY2TjT0/jQkPkSkrpY2TTo6SUfX4SAAAeBwXp//98RUahgoSugoS1gYO3hoexiYuojo5qOzsAAABTamnSAAAA8HRSTlMAAQJGoe79/u+lSgEBAQMPp///////////rhQCBQvI//f3/f///ff3/9ARA6j/8v//////////8v+0Qf/2//z9/v///v37//X/UKf9+f39//////////36/b3r//3//////////////v/6/////////////////////////////////////////+v//f////////////////un/fn9/v/////////9+/3EQf/2//v9//////36//X/WKj/8v//////////8/+/AwULx//29/7///749v/ZFwIBAw+p/////////7obAwJKqPP///exVAKfU1b0AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABG0lEQVR42gEQAe/+AAABAgADBAUGBwgJCgALDAAADQ4PEBESExQVFhcYGRoCGwAcHR4fICEiIyQlJicoKSorAAAsLS4vMDEyMzQ1Njc4OQAAOjs8PT4/QEFCQ0RFRkdISQBKS0xNTk9QUVJTVFVWV1hZAFpbXF1eX2BhYmNkZWZnaGkAamtsbW5vcHFyc3R1dnd4eQB6e3x9fn9igIGCg4SFhoeIAImKi4yNjo+QkZKTlJWWl5gAmZqbnJ2en6ChoqOkpaanqACpqqusra6vsLGys7S1tre4AAC5uru8vb6/wMHCw8TFxscAyMnKy8zNzs/Q0dLT1NXW1wDY2drb3N3e3+DhJOLj5AvlAAAM5gDn6Onq6+zt7gAA7wBSZnCoKaI9jAAAAABJRU5ErkJggg==')))))  
    $icon_files = [System.Drawing.Icon]::ExtractAssociatedIcon("$env:Systemroot\explorer.exe")  

    # create timer control
    $global:timer = New-Object System.Windows.Forms.Timer -p @{
        Interval = $global:timerinterval
        add_Tick = {
            if ($global:pos -le $global:random.Count){
                $pos_x = ($global:random[$global:pos] % $global:imagedivider) * $global:partsize_h
                $pos_y = [math]::Floor($global:random[$global:pos] / $global:imagedivider) * $global:partsize_v
                $destRect = [System.Drawing.Rectangle]::new($pos_x,$pos_y,$global:partsize_h,$global:partsize_v)
                $global:graphics.DrawImage($global:image,$destRect,$pos_x,$pos_y,$global:partsize_h,$global:partsize_v,[System.Drawing.GraphicsUnit]::Pixel)
                $pbox.Image = $global:partimage
                $global:pos++
            }else{
                $global:timer.Stop()
                $menu_starttimer.Text = "Start timer"  
                $form.Text = "$windowtitle | (Finished)"  
                $form.Cursor = [System.Windows.Forms.Cursors]::Hand
                $menu_starttimer.Image = $icon_play
            }
        }
    }
    # function to load new image
    function LoadImage(){
        $dlg = New-Object System.Windows.Forms.OpenFileDialog -P @{
            Filter = 'Image (*.jpg,*.png,*.gif,*.bmp) |*.jpg;*.png;*.gif;*.bmp'  
            Multiselect = $false
        }
        if ($dlg.ShowDialog() -eq 'OK'){  
            $global:image = [System.Drawing.Image]::FromFile($dlg.FileName)
            $global:partimage = [System.Drawing.Bitmap]::new($global:image.Width,$global:image.Height)
            [System.Drawing.Graphics]$global:graphics = [System.Drawing.Graphics]::FromImage($global:partimage)
            $global:partsize_h = [math]::Ceiling($global:image.Width / $global:imagedivider)
            $global:partsize_v = [math]::Ceiling($global:image.Height / $global:imagedivider)
            $global:random = 1..($global:imagedivider*$global:imagedivider) | Get-Random -Count ($global:imagedivider*$global:imagedivider)
            $global:pos = 0
            $pbox.Image = $null
            $menu_starttimer.Enabled = $true
        }
        $dlg.Dispose()
    }
    
    # function which starts/stops puzzle
    function TogglePuzzle {
        if (!$global:image){return}
        if (!$global:timer.Enabled){
            $global:timer.Start()
            $menu_starttimer.Text = "Stop timer"  
            $menu_starttimer.Image = $icon_stop
            $form.Text = "$windowtitle | (Running)"  
            $form.Cursor = [System.Windows.Forms.Cursors]::WaitCursor
        }else{
            $global:timer.Stop()
            $menu_starttimer.Text = "Start timer"  
            $menu_starttimer.Image = $icon_play
            $form.Text = "$windowtitle | (Stopped)"  
            $form.Cursor = [System.Windows.Forms.Cursors]::Hand
        }
    }

    #region CONTEXT-MENU CREATION
    
    # create context menu strip control
    $contextmenu = New-Object System.Windows.Forms.ContextMenuStrip
    # menu item entry to choose image with filedialog
    $menu_chooseimage = New-Object System.Windows.Forms.ToolStripMenuItem -P @{
        Text = "Choose image"  
        Image = $icon_files
        add_Click = {
            LoadImage
        }
    }
    # menu item entry to start timer
    $menu_starttimer = New-Object System.Windows.Forms.ToolStripMenuItem -P @{
        Text = "Start timer"  
        Enabled = $false
        Image = $icon_play
        add_Click = {TogglePuzzle}
    }
    # menu item entry to select timer interval
    $menu_interval = New-Object System.Windows.Forms.ToolStripTextBox -P @{
        ToolTipText = "Timer Interval in ms."  
        Text = $global:timerinterval
        add_KeyUp = {
            [int]$result = 0
            if ([int]::TryParse($menu_interval.Text,[ref]$result)){
                $global:timer.Interval = $result
                $global:timerinterval = $result
            }
        }
        add_KeyDown = {
            if ($_.KeyCode -lt [System.Windows.Forms.Keys]::D0 -or $_.KeyCode -gt [System.Windows.Forms.Keys]::D9){
                if ($_.KeyCode -lt [System.Windows.Forms.Keys]::NumPad0 -or $_.KeyCode -gt [System.Windows.Forms.Keys]::NumPad9){
                    if ($_.KeyCode -ne [System.Windows.Forms.Keys]::Back){
                        $_.SuppressKeyPress = $true
                    }
                }
            }
        }
    }
    # menu item entry to set block size
    $menu_divider = New-Object System.Windows.Forms.ToolStripTextBox -P @{
        ToolTipText = "Image size is divided by this number to define block size (higher number = smaller blocks)"  
        Text = $global:imagedivider
        add_KeyUp = {
            [int]$result = 0
            if ([int]::TryParse($menu_divider.Text,[ref]$result)){
                $global:imagedivider = $result
            }
        }
        add_KeyDown = {
            if ($_.KeyCode -lt [System.Windows.Forms.Keys]::D0 -or $_.KeyCode -gt [System.Windows.Forms.Keys]::D9){
                if ($_.KeyCode -lt [System.Windows.Forms.Keys]::NumPad0 -or $_.KeyCode -gt [System.Windows.Forms.Keys]::NumPad9){
                    if ($_.KeyCode -ne [System.Windows.Forms.Keys]::Back){
                        $_.SuppressKeyPress = $true
                    }
                }
            }
        }
    }
    # menu item entry to exit application
    $menu_exit = New-Object System.Windows.Forms.ToolStripMenuItem -P @{
        Text = 'Exit'  
        add_Click = {
            $form.Close()
        }
    }
    # add context menu items to toolstrip
    [void]$contextmenu.Items.AddRange(@(
        $menu_chooseimage,
        $menu_starttimer,
        (New-Object System.Windows.Forms.ToolStripSeparator),
        (New-Object System.Windows.Forms.ToolStripLabel -P @{Text = "Timer interval (ms):";ForeColor = [System.Drawing.Color]::Brown}),  
        $menu_interval,
        (New-Object System.Windows.Forms.ToolStripSeparator),
        (New-Object System.Windows.Forms.ToolStripLabel -P @{Text = "Image divider";ForeColor = [System.Drawing.Color]::Brown}),  
        $menu_divider,
        (New-Object System.Windows.Forms.ToolStripSeparator),
        $menu_exit
    ))
    #endregion CONTEXT-MENU-CREATION

    # main form control
    $form = New-Object System.Windows.Forms.Form -P @{
        ClientSize = '500,500'  
        Text = $windowtitle
        StartPosition = 'CenterScreen'  
        BackColor = [System.Drawing.Color]::Black
        WindowState = [System.Windows.Forms.FormWindowState]::Maximized
        ContextMenuStrip = $contextmenu
        Cursor = [System.Windows.Forms.Cursors]::Hand
        #ControlBox = $false
        #MaximizeBox = $false
        add_FormClosed = {
            $global:timer.Stop()
            $global:timer.Dispose()
        }
        add_Load = {
            [System.Windows.Forms.MessageBox]::Show("Right click the form to control application options.`nWhen image has been selected you can start/stop timer with single left click on the image.","Info",0,64)  
        }
    }
    # picturebox control
    $pbox = New-Object System.Windows.Forms.PictureBox -P @{
        Dock = 'Fill'  
        Image = $global:image
        SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::Zoom
        add_Click = {
            if ($_.Button -eq 'Left'){  
                TogglePuzzle
            }
        }
    }
    # add controls to form
    $form.Controls.AddRange(@($pbox))
    # show form
    [void]$form.ShowDialog()
}
GeneratePuzzleForm
Viel Spaß damit.

Grüße Uwe
em-pie
em-pie 22.01.2023 um 18:27:55 Uhr
Goto Top
@colinardo
Geiler Typ 😉
Crusher79
Crusher79 23.01.2023 um 10:06:16 Uhr
Goto Top
Zitat von @colinardo:

Servus.
Mal schnell mit Powershell ne kleine Basis-App zusammengelötet wenn man Powerpoint nicht nutzen mag. Kann sich dann jeder nach Gusto anpassen/erweitern.
Viel Spaß damit.

Grüße Uwe

Dich muss man auch bestimmt in den Urlaub oder Freizeitausgleich prügeln, was?

I am Programmer,I have no life.
colinardo
colinardo 23.01.2023 um 10:22:54 Uhr
Goto Top
Zitat von @Crusher79:

Dich muss man auch bestimmt in den Urlaub oder Freizeitausgleich prügeln, was?

I am Programmer,I have no life.
Eigentlich nicht, in den Urlaub reichen 20 Schritte aus dem Camper, schon lacht mir die Januar Sonne und das Meer der Algarve entgegen 😉. Bin nun seit einigen Monaten als "digital nomad" unterwegs, kann ich nur empfehlen 👍.
Crusher79
Crusher79 23.01.2023 um 10:25:30 Uhr
Goto Top
Zitat von @colinardo:

Eigentlich nicht, in den Urlaub reichen 20 Schritte aus dem Camper, schon lacht mir die Januar Sonne und das Meer der Algarve entgegen 😉. Bin nun seit einigen Monaten als "digital Nomad" unterwegs, kann ich nur empfehlen 👍.

Hat was. Habs mal im TV wegen Corona gesehen. Diese Progger "Dörfer". Wo in Viertel nur Freelancer etc. untergebracht waren. Mit allen Freiheiten.

Naja wegen Family nicht möglch. Wobei die sind 3 Wochen zur Kur. Kommen Mittwoch wieder. Gut, das Wetter hier in Niedersachsen ist halt nicht so schön. face-big-smile Aber ansonsten....
Serie: Hochzeitsspiel - Foto aufdecken
Hochzeitsspiel: Fotos aufdecken11