Wie kann ich die Hintergrundfarbe basierend auf der Hintergrundfarbe in Xfce einstellen?

631
tayoung

Ich habe einen Ordner mit Hunderten (möglicherweise Tausenden) von Bildern, die ich verwende, um das Hintergrundbild in Xfce zu durchlaufen. Das einzige Problem ist, dass sie am besten aussehen, wenn das Bild auf "skaliert" eingestellt ist, was für einige Bilder einen "Letterbox" -Effekt hat, der den Rest der Region mit einer durchgehenden Hintergrundfarbe füllt.

Meine Frage ist, ist es möglich, dass die Hintergrundfarbe sich dynamisch mit dem Bild ändert, so dass es nicht so leer aussieht und sich in das Bild einfügt, z. B. wie viele Comic-Zuschauer wie Mcomix ? Wenn Sie nicht wissen, wovon ich rede, lautet die kurze Erklärung: Wenn das Bild größtenteils weiß ist, möchte ich, dass die Hintergrundfarbe weiß ist. Wenn das Bild meistens schwarz ist, möchte ich, dass die Hintergrundfarbe schwarz ist. usw.

1
Könnte das Bearbeiten der Bilder in GIMP nicht in Frage kommen? Sie können die Leinwandgröße einfach auf die Bildschirmauflösung vergrößern, die gewünschte Füllfarbe hinterlegen und das vergrößerte Bild über dem Original speichern. Es ist nicht so elegant wie Win10 mit Fensterdekorationen, aber es erspart den Versuch, xfdesktop zu ersetzen. Dial vor 6 Jahren 0
Auf jeden Fall nicht in Frage, da ich Hunderte, wenn nicht Tausende in diesem Ordner habe und ich lieber Originale aufbewahren und keine Kopien machen muss. tayoung vor 6 Jahren 0
Sie sollten die Frage bearbeiten: "... Ordner mit mehreren Bildern ..." Dial vor 6 Jahren 0
Fertig, ich frage mich, ob ich ein Python-Skript oder etwas schreiben kann, das die Randomisierung von Bildern vornimmt, die dominante Farbe berechnet und die Datei ändert, die den Hintergrund bestimmt. Das muss ich vielleicht tun. tayoung vor 6 Jahren 0
Das ist was ich gedacht habe. Ich habe die Konfiguration auf meinem System unter ~ / .config / xfce4 / xfconf / xfce-perchannel-xml / xfce4-desktop.xml gefunden Dial vor 6 Jahren 1

1 Antwort auf die Frage

0
tayoung

Nach einigem Nachdenken entschied ich mich, ein Python-Skript (Python 3) zu schreiben, das Änderungen an der last-imageVerwendung des praktischen xfconf-queryHilfsprogramms mithilfe einiger Informationen überwacht, die ich hier gefunden habe (etwas modifiziert, um nur die Randpixel zu erhalten).

Sie müssen numpy und Pillow installieren (vorzugsweise mit pip):

pip3 install Pillow pip3 install numpy

Als nächstes erstellen Sie eine .py-Datei mit diesem Skript. Ich nenne es "change-bg-with-color.py":

#!/usr/bin/python3 from PIL import Image from subprocess import Popen, PIPE import numpy as np import os import traceback  # Edit to point to your workspace WORKSPACE = "/backdrop/screen0/monitor2/workspace0"  # Choose your flavor! Average... def compute_average_image_color(img): width, height = img.size  r_total = 0 g_total = 0 b_total = 0 a_total = 0  count = 0  # Get top and bottom borders for y in [0,height-1]: for x in range(0, width): r, g, b, a = img.getpixel((x,y)) r_total += r g_total += g b_total += b a_total += a count += 1  # Get left and right borders for x in [0,width-1]: for y in range(0, height): r, g, b, a = img.getpixel((x,y)) r_total += r g_total += g b_total += b a_total += a count += 1  return (np.uint16(r_total/count * 65535.0/255.0), np.uint16(g_total/count * 65535.0/255.0), np.uint16(b_total/count * 65535.0/255.0), np.uint16(a_total/count * 65535.0/255.0))  # or Mode def compute_mode_image_color(img): width, height = img.size  pixel_bins = {}  # Get top and bottom borders for y in [0,height-1]: for x in range(0, width): pixel = img.getpixel((x,y))  if pixel in pixel_bins: pixel_bins[pixel] += 1 else: pixel_bins[pixel] = 1  # Get left and right borders for x in [0,width-1]: for y in range(0, height): pixel = img.getpixel((x,y))  if pixel in pixel_bins: pixel_bins[pixel] += 1 else: pixel_bins[pixel] = 1  pixel = (255,255,255,255) mode = 0 for p,m in pixel_bins.items(): if m > mode: pixel = p  return (np.uint16(pixel[0] * 65535.0/255.0), np.uint16(pixel[1] * 65535.0/255.0), np.uint16(pixel[2] * 65535.0/255.0), np.uint16(pixel[3] * 65535.0/255.0))  # Start the monitor for changes to last-image process = Popen(["xfconf-query", "-c", "xfce4-desktop", "-p", os.path.join(WORKSPACE, "last-image"), "-m"], stdout=PIPE) while True: try: # Get the initial BG image from the workspace p2 = Popen(["xfconf-query", "-c", "xfce4-desktop", "-p", os.path.join(WORKSPACE, "last-image")], stdout=PIPE) (filename, err) = p2.communicate() exit_code = p2.wait()  # Next, open the image img = Image.open(filename.decode('utf-8').strip()).convert("RGBA")  # Determine and set the color (CHOOSE YOUR FLAVOR HERE) color = compute_mode_image_color(img) p2 = Popen(["xfconf-query", "-c", "xfce4-desktop", "-p", os.path.join(WORKSPACE, "color1"), "-s", str(color[0]), "-s", str(color[1]), "-s", str(color[2]), "-s", str(color[3])], stdout=PIPE) (output, err) = p2.communicate() p2.wait()  # Wait for next line line = process.stdout.readline() if line == '' and process.poll() is not None: break except Exception as e: print(e) traceback.print_exc() pass 

Wählen Sie Ihren Geschmack (Durchschnitt oder Modus). WORKSPACEStellen Sie sicher, dass Sie das Feld so ändern, dass es auf Ihren Arbeitsbereich verweist. Sie können dies normalerweise herausfinden, indem Sie in ~ / .config / xfce4 / xfconf / xfce-perchannel-xml / xfce4-desktop.xml nachsehen (danke Dial!)

Führen Sie einfach das Skript aus, und die Hintergrundfarbe ändert sich sofort. Sie können dies natürlich so konfigurieren, dass es beim Start ausgeführt wird, diese Details werden jedoch der Einfachheit halber ausgelassen. Das funktioniert bei mir!