Как установить цвет фона на основе цвета обоев в Xfce?

Как установить цвет фона на основе цвета обоев в Xfce?

У меня есть папка с сотнями (возможно, тысячами) изображений, которые я использую для смены обоев в Xfce. Единственная проблема в том, что они выглядят лучше всего, когда изображение установлено в режим «масштабировано», что для некоторых изображений будет иметь эффект «почтового ящика», заполняющий остальную часть области сплошным фоновым цветом.

Мой вопрос в том, возможно ли, чтобы цвет фона динамически менялся вместе с изображением, чтобы он не выглядел таким пустым и соответствовал изображению, как это нравится многим зрителям комиксов?mcomixделать? Если вы не понимаете, о чем я говорю, вот краткое объяснение: если изображение в основном белое, я хочу, чтобы сплошной цвет фона был белым; если изображение в основном черное, я хочу, чтобы сплошной цвет фона был черным; и т. д.

решение1

После некоторых раздумий я решил написать скрипт на Python (Python 3), который отслеживает изменения в last-imageиспользовании удобной xfconf-queryутилиты, используя некоторую информацию, которую я нашел.здесь(слегка изменено, чтобы получить только граничные пиксели).

Вам потребуется установить (предпочтительно с помощью pip) numpy и Pillow:

pip3 install Pillow pip3 install numpy

Далее создайте файл .py с этим скриптом внутри; я называю его «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

Выберите свой вкус (средний или режим). Обязательно измените поле, WORKSPACEчтобы оно указывало на ваше рабочее пространство. Обычно это можно узнать, посмотрев в ~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml (спасибо Dial!)

Просто запустите скрипт, и бац, мгновенное изменение цвета фона. Конечно, вы можете настроить его на запуск при запуске, но эти детали опущены для простоты. У меня это работает!

Связанный контент