Wie kann ich ein Side-Scrolling-Hintergrundbild einrichten?

10

Ich möchte, dass mein Hintergrundbild eine Seitenrolle von Super Mario World Yoshis Insel 1 ist . Sobald das Hintergrundbild vollständig gescrollt war, kehrte es nahtlos zum Anfang zurück.

Gibt es ein Programm oder XML, das dies für mich erreichen würde? Ich benutze GNOME Shell.

Soren
quelle
6
So . . . Sie möchten im Grunde ein animiertes Hintergrundbild haben?
Sergiy Kolodyazhnyy
Es ist animiert, aber ich konnte nichts finden, was es zum seitlichen Scrollen bringen könnte.
Soren
3
Ich denke, Sie können dieses Bild in mehrere "Schnappschüsse" aufteilen und eine XML-Datei verwenden, um Übergänge mit einem festgelegten Zeitraum einzurichten. Auf diese Weise ist es ähnlich wie in alten Konsolenspielen, in denen Sie eine "Ansicht" haben, dann die Grenze überschreiten und eine andere Ansicht auf dem Bildschirm angezeigt wird, und so weiter. Denken Sie, das wäre eine gute Idee?
Sergiy Kolodyazhnyy
2
Ich denke darüber nach, ein Skript dafür zu schreiben. Könnte ein paar Tage dauern. Ich werde Sie wissen lassen, sobald ich einen Arbeitscode gefunden habe, OK?
Sergiy Kolodyazhnyy
1
Ich würde diese Anfrage an den Entwickler von XScreenSaver weiterleiten. Es klingt nach einer wunderbaren Idee, die der Entwickler hoffentlich in Betracht ziehen würde. Es wäre kein Hintergrundbild, wie Sie es gewünscht haben, sondern eine alternative Lösung, um Ihre "grafischen Wünsche" zu erfüllen. In ähnlicher Weise könnte auch der Ordner "Ein / Bilder" auf diese Weise in die Warteschlange gestellt werden, um einen Bildlauf durchzuführen. Ihre Anfrage gefällt mir sehr gut!
WinEunuuchs2Unix

Antworten:

4

Update 22.10.16

Das Skript wurde aktualisiert, um den Anforderungen in dieser Frage zu entsprechen: /ubuntu//a/840381/295286

Übergang und Dauer wurden optional gemacht und hatten Standardwerte. -sDie Option für die Größe von Hintergrundbildern wurde ebenfalls hinzugefügt (wie die Optionen "Kacheln", "Skalieren" und "Dehnen" in den Systemeinstellungen).


Wie ich bereits in den Kommentaren sagte, müssten Sie das Bild in gleich große oder überlappende Teile schneiden und eine Diashow dafür erstellen. Ich kenne die Lizenz für das gewünschte Bild nicht, daher überlasse ich es Ihnen, es zu schneiden ( Hinweis ).

Hier ist jedoch ein animiertes Wallpaper-Generator-Skript, das ich geschrieben habe. Die Verwendung ist sehr einfach. Wie durch -hOption gezeigt :

usage: xml_wallpaper_maker.py [-h] -d DIRECTORY -t TRANSITION -l LENGTH [-o]

Serg's XML slideshow creator

optional arguments:
  -h, --help            show this help message and exit
  -d DIRECTORY, --directory DIRECTORY
                        Directory where images stored
  -t TRANSITION, --transition TRANSITION
                        transition time in seconds
  -l LENGTH, --length LENGTH
                        Time length in seconds per image
  -o, --overlay         Enables use of overlay transition

Beispiel:

./xml_wallpaper_maker.py -d Pictures/My_SideScroller_Images/ -t 5 -l 10 

Quellcode

Auch auf GitHub verfügbar

#!/usr/bin/env python3
# -*- coding: utf-8 -*- 

#
# Author: Serg Kolo , contact: [email protected]
# Date: September 2 , 2016
# Purpose: A program that creates and launches XML slideshow
#      
# Tested on: Ubuntu 16.04 LTS
#
#
# Licensed under The MIT License (MIT).
# See included LICENSE file or the notice below.
#
# Copyright © 2016 Sergiy Kolodyazhnyy
#
# 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.


from gi.repository import Gio
import xml.etree.cElementTree as ET
import lxml.etree as etree
import argparse
import sys
import os

def gsettings_set(schema, path, key, value):
    """Set value of gsettings schema"""
    if path is None:
        gsettings = Gio.Settings.new(schema)
    else:
        gsettings = Gio.Settings.new_with_path(schema, path)
    if isinstance(value,list ):
        return gsettings.set_strv(key, value)
    if isinstance(value,int):
        return gsettings.set_int(key, value)
    if isinstance(value,str):
        return gsettings.set_string(key,value)

def parse_args():
        """ Parses command-line arguments """
        arg_parser = argparse.ArgumentParser(
        description='Serg\'s XML slideshow creator',
        )

        arg_parser.add_argument(
                                '-d', '--directory',
                                help='Directory where images stored',
                                type=str,
                                required=True
                                )

        arg_parser.add_argument(
                                '-t','--transition', 
                                type=float,
                                help='transition time in seconds',
                                required=True
                                )


        arg_parser.add_argument(
                                '-l','--length', 
                                type=float,
                                help='Time length in seconds per image',
                                required=True
                                )

        arg_parser.add_argument(
                                '-o','--overlay', 
                                action='store_true',
                                help='Enables use of overlay transition',
                                required=False
                                )
        return arg_parser.parse_args()



def main():
    """ Program entry point"""
    args = parse_args()
    xml_file = os.path.join(os.path.expanduser('~'),'.local/share/slideshow.xml')
    path = os.path.abspath(args.directory)
    duration = args.length
    transition_time = args.transition

    if not os.path.isdir(path):
       print(path," is not a directory !")
       sys.exit(1)

    filepaths = [os.path.join(path,item) for item in os.listdir(path) ]
    images = [ img for img in filepaths if os.path.isfile(img)]
    filepaths = None
    images.sort()
    root = ET.Element("background")
    previous = None

    # Write the xml data of images and transitions
    for index,img in enumerate(images):

        if index == 0:
           previous = img
           continue

        image = ET.SubElement(root, "static")
        ET.SubElement(image,"duration").text = str(duration)
        ET.SubElement(image,"file").text = previous

        if args.overlay: 
            transition = ET.SubElement(root,"transition",type='overlay')
        else:
            transition = ET.SubElement(root,"transition")
        ET.SubElement(transition,"duration").text = str(transition_time)
        ET.SubElement(transition, "from").text = previous
        ET.SubElement(transition, "to").text = img

        previous = img

    # Write out the final image
    image = ET.SubElement(root, "static")
    ET.SubElement(image,"duration").text = str(duration)
    ET.SubElement(image,"file").text = previous

    # Write out the final xml data to file
    tree = ET.ElementTree(root)
    tree.write(xml_file)

    # pretty print the data
    data = etree.parse(xml_file)
    formated_xml = etree.tostring(data, pretty_print = True)
    with open(xml_file,'w') as f:
        f.write(formated_xml.decode())

    gsettings_set('org.gnome.desktop.background',None,'picture-uri','file://' + xml_file)

if __name__ == '__main__':
    main()
Sergiy Kolodyazhnyy
quelle
Wissen Sie, wie Sie ein Bild programmgesteuert in n* nTeile schneiden nund dabei nbei jedem Schnitt entlang der Pixel x und y bewegen können ? Zum Beispiel wäre der Befehl für das YI1-Hintergrundbild command 1920 1080 1 0und es würde sich selbst schleifen?
Soren
@moo_we_all_do eigentlich wurde dies schon einmal gefragt: askubuntu.com/a/143501/295286
Sergiy Kolodyazhnyy
Um mich zu drehen, würde ich die ersten 1920 Pixel nehmen und sie nach hinten kopieren?
Soren
@moo_we_all_do was meinst du Loop-Around? Was Sie tun müssen, ist, das Bild in gleichmäßige Teile aufzuteilen, sie in einen Ordner zu legen und einfach den Skriptpfad zu diesem Ordner anzugeben. Das XML-Hintergrundbild wechselt automatisch und
kehrt
Mit Schleife meine ich Scrollen, und ich habe es herausgefunden, danke! : D
Soren