¿Cómo configurar el color de fondo según el color del fondo de pantalla en Xfce?

¿Cómo configurar el color de fondo según el color del fondo de pantalla en Xfce?

Tengo una carpeta con cientos (posiblemente miles) de imágenes que uso para cambiar el fondo de pantalla en Xfce. El único problema es que se ven mejor cuando la imagen está configurada en "escala", lo que en algunas imágenes tendrá un efecto "buzón", que llena el resto de la región con un color de fondo sólido.

Mi pregunta es, ¿es posible que dicho color de fondo cambie dinámicamente con la imagen para que no parezca tan vacío y encaje con la imagen, como a cuántos espectadores de cómics les gusta?mcomix¿hacer? Si no sabes de qué estoy hablando, la breve explicación es: si la imagen es mayoritariamente blanca, quiero que el color de fondo sólido sea blanco; si la imagen es mayoritariamente negra, quiero que el color de fondo sólido sea negro; etc.

Respuesta1

Después de pensar un poco, decidí escribir un script de Python (Python 3) que monitorea los cambios en el last-imageuso de la práctica xfconf-queryutilidad usando cierta información que encontré.aquí(ligeramente modificado para obtener solo los píxeles del borde).

Necesitará instalar (preferiblemente usando pip) numpy y Pillow:

pip3 install Pillow pip3 install numpy

A continuación, cree un archivo .py con este script; Yo lo llamo "cambiar-bg-con-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

Elige tu sabor (promedio o modo). Asegúrese de modificar el WORKSPACEcampo para que apunte a su espacio de trabajo. Por lo general, puede descubrir esto buscando en ~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml (¡gracias Dial!)

Simplemente ejecute el script y bam, cambios instantáneos de color de fondo. Por supuesto, puede configurar esto para que se ejecute al inicio, pero esos detalles se omiten en aras de la simplicidad. ¡Esto funciona para mí!

información relacionada