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