Xfce에서 배경화면 색상을 기반으로 배경색을 설정하는 방법은 무엇입니까?

Xfce에서 배경화면 색상을 기반으로 배경색을 설정하는 방법은 무엇입니까?

Xfce에서 배경화면을 순환하는 데 사용하는 수백(아마도 수천) 개의 이미지가 있는 폴더가 있습니다. 유일한 문제는 이미지가 "크기 조정"으로 설정되었을 때 가장 잘 보인다는 것입니다. 일부 이미지의 경우 나머지 영역을 단색 배경색으로 채우는 "레터박스" 효과가 있습니다.

제 질문은 배경색이 이미지와 함께 동적으로 변경되어 너무 공허해 보이지 않고 이미지와 잘 어울리도록 하는 것입니다. 예를 들어 얼마나 많은 만화 시청자가 좋아하는지와 같습니다.엠코믹스하다? 내가 무슨 말을 하는지 모르신다면 간단히 설명하자면 다음과 같습니다. 이미지가 대부분 흰색인 경우 단색 배경색을 흰색으로 설정하고 싶습니다. 이미지가 대부분 검은색이라면 단색 배경색을 검은색으로 설정하고 싶습니다. 등.

답변1

몇 가지 생각 끝에 저는 제가 찾은 일부 정보를 사용하여 last-image편리한 유틸리티 사용 에 대한 변경 사항을 모니터링하는 Python 스크립트(Python 3)를 작성하기로 결정했습니다.xfconf-query여기(경계 픽셀만 가져오도록 약간 수정됨)

numpy와 Pillow를 설치해야 합니다(바람직하게는 pip 사용).

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에게 감사드립니다!)

간단히 스크립트를 실행하면 즉시 배경색이 변경됩니다. 물론 시작 시 실행되도록 구성할 수 있지만 단순성을 위해 해당 세부 정보는 생략되었습니다. 이것은 나에게 효과적입니다!

관련 정보