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

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

1 ответ1

0

Подумав немного, я решил написать скрипт на 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!)

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .