Albirew/lnxpcs
Albirew
/
lnxpcs
Archivé
1
0
Bifurcation 0

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
Cette révision appartient à :
Moviuro 2017-12-06 21:32:05 +01:00
Parent 8fb0ec040c
révision 7a3cd41678
1 fichiers modifiés avec 47 ajouts et 21 suppressions

Voir le fichier

@ -28,10 +28,19 @@ set -e
usage() { usage() {
cat << EOH cat << EOH
Usage: $0 [-s] <source file> <width> <height> : creates a wallpaper Generate wallpapers to a specified size, given a base picture
-s : use a "safer" and slower method to get the background color
$0 -h : displays this help message $0 [-vs] width height [picture [picture [...]]]
Example: $0 coolimage.png 1920 1080 $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 EOH
exit ${1:-0} exit ${1:-0}
} }
@ -40,18 +49,24 @@ die() {
echo "$1" && exit "${2:-1}" echo "$1" && exit "${2:-1}"
} }
if [ "$1" = "-h" ]; then while getopts ":hvs" _opt; do
usage case "$_opt" in
fi 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() { getbg() {
# We get all hexa codes of all pixels in the picture, and pick the most # We get all hexa codes of all pixels in the picture, and pick the most
# frequent one... which should be the background color? # frequent one... which should be the background color?
convert "$1" -format %c +dither -depth 5 histogram:info: | convert "$1" -format %c +dither -depth 5 histogram:info: |
sort -nr | head -1 | grep -Eo '#[A-F0-9]{6}' sort -nr | head -1 | grep -Eo '#[A-F0-9]{6}'
} }
shift
else else
getbg() { getbg() {
# We get the color of the top-left pixel. # We get the color of the top-left pixel.
@ -59,19 +74,30 @@ else
} }
fi 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 usage 1 >&2
fi fi
width="$1"
height="$2"
shift 2
[ -r "$1" ] || die "File $1 is not readable!" { if [ -z "$1" ]; then
inpfile="$1" # No arguments, we read stdin
outfile="$(basename "$inpfile")" cat -
width="$2" else
height="$3" for _file in "$@"; do
bgcolor="$(getbg "$inpfile")" 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 # We use the `-resize ..x..\>` syntax to only shrink pictures. Enlarging is
# asking for trouble (artifacting, etc.) # asking for trouble (artifacting, etc.)
convert "$inpfile" -gravity center -resize "${width}x${height}>" \ convert "$inpfile" -gravity center -resize "${width}x${height}>" \
-background "$bgcolor" -extent "${width}x${height}" \ -background "$bgcolor" -extent "${width}x${height}" \
"${outfile%.*}-${width}x${height}.${outfile##*.}" "${outfile%.*}-${width}x${height}.${outfile##*.}"
done