Skip to content

Instantly share code, notes, and snippets.

@adyeths
Last active October 16, 2024 22:00
Show Gist options
  • Select an option

  • Save adyeths/78a3dc3db36c6c15bf5afb2ca7abfb64 to your computer and use it in GitHub Desktop.

Select an option

Save adyeths/78a3dc3db36c6c15bf5afb2ca7abfb64 to your computer and use it in GitHub Desktop.
a simple ebook cover creator
#!/bin/sh
usage() {
cat << EOF
USAGE:
$0 [options] "book title" "book author"
OPTIONS:
-c [red, brick, orange, gold, yellow, lime, (default is plasma)
green, teal, blue, indigo, purple, magenta,
grey, plasma]
-t Title
-s Subtitle
-a Author
-f Title and Subtitle Font (default is serif)
-p point size (default is 36)
-h show help
* prepend g- to color for gradient effect (except for plasma)
EOF
exit
}
# parse options
opts="c:t:s:a:f:p:h"
TYP=""
TITLE=""
SUBTITLE=""
AUTHOR=""
FNT="serif"
while getopts ${opts} opt; do
i=$((i+1))
case ${opt} in
c) TYP=${OPTARG};;
t) TITLE=${OPTARG};;
s) SUBTITLE=${OPTARG};;
a) AUTHOR=${OPTARG};;
f) FNT=${OPTARG};;
p) PNT=${OPTARG};;
?) usage;;
esac
done
shift $((OPTIND-1))
if [ -z $TYP ]; then
TYP="plasma"
fi
expr $PNT + 0 >/dev/null 2>/dev/null
if [ $? -eq 0 ]; then
PNT2=$(echo "scale=0;$PNT/3*2" | bc)
else
PNT=36
PNT2=24
fi
PNT=$(($PNT * 1024))
PNT2=$(($PNT2 * 1024))
# set background colors
if [ $(echo $TYP | cut -c1-2) = "g-" ]; then
png=2
TYP=$(echo $TYP | cut -c3-)
else
png=1
fi
# -- these colors are from the libreoffice standard color palette
colors=$(cat <<EOF
red #ffa6a6 #ff6d6d #ff3838
brick #ffaa95 #ff7b59 #ff5429
orange #ffb66c #ff972f #ff860d
gold #ffe994 #ffde59 #ffd428
yellow #ffffa6 #ffff6d #ffff38
lime #e8f2a1 #d4ea6b #bbe33d
green #afd095 #77bc65 #3faf46
teal #b3cac7 #81aca6 #50938a
blue #b4c7dc #729fcf #5983b0
indigo #b7b3ca #8e86ae #6b5e9b
purple #bf819e #a1467e #8d1d75
magenta #ec9ba4 #e16173 #d62e4e
grey #cccccc #b2b2b2 #999999
EOF
)
case $TYP in
"red"|"brick"|"orange"|"gold"|"yellow"|"lime"|"green"|"teal"|"blue"|"indigo"|"purple"|"magenta"|"grey")
back1=$(echo "$colors" | grep $TYP | cut -d " " -f 2)
if [ $png = 1 ]; then
back2=$(echo "$colors" | grep $TYP | cut -d " " -f 3)
else
# use a darker second color for gradient background
back2=$(echo "$colors" | grep $TYP | cut -d " " -f 4)
fi
;;
"plasma")
back1="white"
back2="fractal"
png=0
;;
*)
usage
;;
esac
TITLETEXT=$(cat <<EOF
<b>\n\n\n\n\n<span font_family="$FNT" size="$PNT">$TITLE</span>\n\n
<span font_family="$FNT" style="Italic" size="$PNT2">$SUBTITLE</span></b>
EOF
)
AUTHORTEXT=$(cat <<EOF
<span font_family="sans-serif" size="$PNT2">$AUTHOR</span>
EOF
)
# generate cover images
case $png in
1) # solid colors
convert \
-define pango:wrap=word -define pango:hinting=none -gravity center \
-size 625x1000 canvas:$back1 \
-fill canvas:$back2 -draw "rectangle 0,667 625,1000" \
-background none \
\( \
-size 525x667 canvas:none -size 525x pango:"$TITLETEXT" \
-flatten \
\) \
-gravity north -composite -gravity center \
\( \
-size 525x333 canvas:none -size 525x pango:"$AUTHORTEXT" \
-gravity center -composite \
\) \
-gravity south -composite \
-flatten -dither none -colors 16 -quality 90 png8:cover.png
advpng -z -4 cover.png 2>/dev/null 1>/dev/null
;;
2) # gradients
convert \
-define pango:wrap=word -define pango:hinting=none -gravity center \
-size 625x1000 canvas:$back1 \
-fill gradient:$back1-$back2 -draw "rectangle 0,334 625,1000" \
-background none \
\( \
-size 525x667 canvas:none -size 525x pango:"$TITLETEXT" \
-flatten \
\) \
-gravity north -composite -gravity center \
\( \
-size 525x333 canvas:none -size 525x pango:"$AUTHORTEXT" \
-gravity center -composite \
\) \
-gravity south -composite \
-flatten -quality 90 cover.png
pngcrush -brute cover.png new-cover.png 2>/dev/null && mv new-cover.png cover.png
;;
*) # plasma fractal
convert \
-define pango:wrap=word -define pango:hinting=none -gravity center \
-size 625x1000 plasma:$back1-$back2 \
-background none \
\( \
-size 525x667 canvas:none -size 525x pango:"$TITLETEXT" \
-flatten \
\) \
-gravity north -composite -gravity center \
\( \
-size 525x333 canvas:none -size 525x pango:"$AUTHORTEXT" \
-gravity center -composite \
\) \
-gravity south -composite \
-flatten -quality 85% cover.jpg
;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment