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() {
cat << EOH
Usage: $0 [-s] <source file> <width> <height> : 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