wallpaper: add options to modify scoring

This commit is contained in:
Vincent Bernat 2021-08-31 17:38:17 +02:00
parent c8bd6f35a4
commit fd5bfda5f3

View file

@ -20,6 +20,7 @@ import collections
import itertools import itertools
import logging import logging
import logging.handlers import logging.handlers
import inspect
from Xlib import display from Xlib import display
from Xlib.ext import randr from Xlib.ext import randr
@ -136,7 +137,7 @@ def get_random_images(directory, number):
return images return images
def get_best_parts(groups, images): def get_best_parts(groups, images, ratio_score=100, scale_score=60, wallpaper_score=2):
"""Find optimal association for images for the groups of covering rectangles. """Find optimal association for images for the groups of covering rectangles.
>>> gbp = get_best_parts >>> gbp = get_best_parts
@ -201,15 +202,15 @@ def get_best_parts(groups, images):
r = iratio / oratio r = iratio / oratio
if r > 1: if r > 1:
r = 1 / r r = 1 / r
score += r * 100 score += r * ratio_score
# Similar scale (when cropped) # Similar scale (when cropped)
opixels = assoc.rectangle.width * assoc.rectangle.height opixels = assoc.rectangle.width * assoc.rectangle.height
ipixels = assoc.image.width * assoc.image.height * r ipixels = assoc.image.width * assoc.image.height * r
r = ipixels / opixels r = ipixels / opixels
if r >= 1: if r >= 1:
r = 1 r = 1
score += r * 60 score += r * scale_score
score /= len(group) * len(group) score /= pow(len(group), wallpaper_score)
logger.debug("association: %s, score %.2f", association, score) logger.debug("association: %s, score %.2f", association, score)
if score > best_score or best_association is None: if score > best_score or best_association is None:
best_association = association best_association = association
@ -259,25 +260,43 @@ if __name__ == "__main__":
default=False, default=False,
help="enable debugging", help="enable debugging",
) )
parser.add_argument( group = parser.add_argument_group("image selection")
group.add_argument(
"-d", "-d",
"--directory", "--directory",
default=".", default=".",
help="search for images in DIRECTORY", help="search for images in DIRECTORY",
) )
parser.add_argument( group.add_argument(
"-t",
"--target",
default="background.png",
help="write background to FILE",
)
parser.add_argument(
"--extra-images", "--extra-images",
default=3, default=3,
metavar="N", metavar="N",
help="consider N additional images to choose the best combination", help="consider N additional images to choose the best combination",
) )
parser.add_argument( params = inspect.signature(get_best_parts).parameters
group.add_argument(
"--ratio-score",
default=params["ratio_score"].default,
help="multiplicative weight applied to ratio matching for score",
)
group.add_argument(
"--scale-score",
default=params["scale_score"].default,
help="multiplicative weight applied to pixel matching for score",
)
group.add_argument(
"--wallpaper-score",
default=params["wallpaper_score"].default,
help="invert power weight applied to the number of wallpapers used",
)
group = parser.add_argument_group("image output")
group.add_argument(
"-t",
"--target",
default="background.png",
help="write background to FILE",
)
group.add_argument(
"--compression", default=0, type=int, help="compression level when saving" "--compression", default=0, type=int, help="compression level when saving"
) )
options = parser.parse_args() options = parser.parse_args()
@ -299,7 +318,13 @@ if __name__ == "__main__":
images = get_random_images( images = get_random_images(
options.directory, len(outputs) + options.extra_images options.directory, len(outputs) + options.extra_images
) )
wallpaper_parts = get_best_parts(candidates, images) wallpaper_parts = get_best_parts(
candidates,
images,
ratio_score=options.ratio_score,
scale_score=options.scale_score,
wallpaper_score=options.wallpaper_score,
)
for part in wallpaper_parts: for part in wallpaper_parts:
logger.info( logger.info(
"wallpaper: {} ({}×{})".format( "wallpaper: {} ({}×{})".format(