0 votos

Cómo establecer el color de fondo basado en el papel tapiz de color en Xfce?

Tengo una carpeta con cientos (posiblemente miles) de imágenes en las que yo uso para el ciclo el fondo de escritorio de Xfce. El único problema es que se ven mejor cuando la imagen está ajustado a "escala", que para algunos las imágenes tendrán un "buzón" en efecto, la 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 para cambiar dinámicamente con la imagen de modo que no parezca tan vacío y encaja con la imagen, tales como la forma de historietas muchos espectadores como mcomix hacer? Si usted no sabe de qué estoy hablando, la explicación más sencilla es: si la imagen es mayormente blanca, quiero que el color de fondo sólido blanco; si la imagen es en su mayoría negro, quiero que el color de fondo sólido para ser negro; etc.

0voto

tayoung Puntos 16

Después de pensar tanto, me decidí a escribir una secuencia de comandos de Python (Python 3) que monitorea los cambios a last-image utilizando el útil xfconf-query de utilidad el uso de cierta información que he encontrado aquí (ligeramente modificado para obtener sólo los píxeles de borde).

Usted tendrá que instalar (preferiblemente usando pip) numpy y Almohada:

pip3 install Pillow pip3 install numpy

A continuación, hacer un .py archivo con este script en él; yo lo llamo "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

Elige tu sabor (promedio o modo). Asegúrese de modificar el WORKSPACE campo a punto de su área de trabajo. Puedes encontrar esta viendo en ~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml (gracias Esfera!)

Simplemente ejecutar la secuencia de comandos, y bam, instantánea cambios de color de fondo. Por supuesto, que puede configurar para que se ejecute en el inicio, pero los detalles se dejan para el bien de la simplicidad. Esto funciona para mí!

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: