about summary refs log tree commit diff
path: root/sh/convwall
diff options
context:
space:
mode:
authorXiao Pan <gky44px1999@gmail.com>2023-02-09 16:50:19 -0800
committerXiao Pan <gky44px1999@gmail.com>2023-02-09 16:50:19 -0800
commit6156db64bd38f5d3ba299c77df6268a1afed35f1 (patch)
tree8d1573311895e30a05e0cc9fa5e43763e78f7dd7 /sh/convwall
init
Diffstat (limited to 'sh/convwall')
-rwxr-xr-xsh/convwall35
1 files changed, 35 insertions, 0 deletions
diff --git a/sh/convwall b/sh/convwall
new file mode 100755
index 0000000..8efd136
--- /dev/null
+++ b/sh/convwall
@@ -0,0 +1,35 @@
+#!/bin/sh
+# CONVert WALLpaper
+
+# target image aspect ratio
+wratio=$SCR_WIDTH
+hratio=$SCR_HEIGHT
+# chop how much from center
+chopnum=99%
+
+# my benchmark shows -ping is much faster than default
+# https://github.com/ImageMagick/ImageMagick/issues/3183#issuecomment-800955241
+width=$(identify -ping -format '%w' "$1")
+height=$(identify -ping -format '%h' "$1")
+
+ratio=$((wratio*100/hratio))
+dim=$((width*100/height))
+
+if [ "$dim" -ne "$ratio" ]; then
+	if [ "$dim" -lt "$ratio" ]; then
+		chopgeom="${chopnum}x0"	
+		width=$((height*wratio/hratio))
+	else
+		chopgeom="0x$chopnum"	
+		height=$((width*hratio/wratio))
+	fi
+	# may throw error "sort: write failed: 'standard output': Broken pipe \n sort: write error"
+	# caused by head exit (or close stdin) before sort output complete, can ignore
+	# https://stackoverflow.com/questions/46202653/bash-error-in-sort-sort-write-failed-standard-output-broken-pipe
+	bgcolor=$(convert "$1" -gravity center -chop "$chopgeom" -define histogram:unique-colors=true -format %c histogram:info:- | sort -rn | head -n1 | awk \{print\ \$3\} | cut -c1-7)
+	# another approach is to use "$width" or "x$height" for geometry, current approach is more readable
+	convert "$1" -gravity center -background "$bgcolor" -extent "${width}x$height" "$2"
+else
+	echo 'same aspect ratio, no need to convert' >&2
+	exit 1
+fi