From 7a3cd4167801495da4c7f39b6885738c5f3e7529 Mon Sep 17 00:00:00 2001 From: Moviuro Date: Wed, 6 Dec 2017 21:32:05 +0100 Subject: [PATCH] makemywall: new interface We support new ways of reading files that we want to modify/generate: % ./makemywall 1920 1080 myfile1.png myfile2.png % ./makemywall 1920 1080 < mylist.txt % find . -type f -name '*.png' | ./makemywall 1080 1920 --- makemywall | 68 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 21 deletions(-) diff --git a/makemywall b/makemywall index 71c06e4..476db5c 100755 --- a/makemywall +++ b/makemywall @@ -28,10 +28,19 @@ set -e usage() { cat << EOH -Usage: $0 [-s] : creates a wallpaper - -s : use a "safer" and slower method to get the background color - $0 -h : displays this help message -Example: $0 coolimage.png 1920 1080 +Generate wallpapers to a specified size, given a base picture + +$0 [-vs] width height [picture [picture [...]]] +$0 -h + +-h : displays this help message +-s : use a "safer" and slower method to get the background color +-v : be verbose (set -x) + +Example: $0 1920 1080 coolimage.png + +The following syntax also works: +find . -type f -name '*.png' | $0 1080 1920 EOH exit ${1:-0} } @@ -40,18 +49,24 @@ die() { echo "$1" && exit "${2:-1}" } -if [ "$1" = "-h" ]; then - usage -fi +while getopts ":hvs" _opt; do + case "$_opt" in + h) usage ;; + s) _slow=1 ;; + v) set -x ;; + *) usage 1 >&2 ;; + esac +done -if [ "$1" = "-s" ]; then +shift $((OPTIND-1)) + +if [ -n "$_slow" ]; then getbg() { # We get all hexa codes of all pixels in the picture, and pick the most # frequent one... which should be the background color? convert "$1" -format %c +dither -depth 5 histogram:info: | sort -nr | head -1 | grep -Eo '#[A-F0-9]{6}' } - shift else getbg() { # We get the color of the top-left pixel. @@ -59,19 +74,30 @@ else } fi -if [ $# -ne 3 ]; then +# We require width & height +# TODO: maybe auto-detect? seems tricky with dual screen +if [ $# -lt 2 ]; then usage 1 >&2 fi +width="$1" +height="$2" +shift 2 -[ -r "$1" ] || die "File $1 is not readable!" -inpfile="$1" -outfile="$(basename "$inpfile")" -width="$2" -height="$3" -bgcolor="$(getbg "$inpfile")" +{ if [ -z "$1" ]; then + # No arguments, we read stdin + cat - +else + for _file in "$@"; do + printf "%s\n" "$_file" + done +fi } | +while IFS= read -r inpfile; do + outfile="$(basename "$inpfile")" + bgcolor="$(getbg "$inpfile")" -# We use the `-resize ..x..\>` syntax to only shrink pictures. Enlarging is -# asking for trouble (artifacting, etc.) -convert "$inpfile" -gravity center -resize "${width}x${height}>" \ - -background "$bgcolor" -extent "${width}x${height}" \ - "${outfile%.*}-${width}x${height}.${outfile##*.}" + # We use the `-resize ..x..\>` syntax to only shrink pictures. Enlarging is + # asking for trouble (artifacting, etc.) + convert "$inpfile" -gravity center -resize "${width}x${height}>" \ + -background "$bgcolor" -extent "${width}x${height}" \ + "${outfile%.*}-${width}x${height}.${outfile##*.}" +done