Last active
October 16, 2024 22:00
-
-
Save adyeths/78a3dc3db36c6c15bf5afb2ca7abfb64 to your computer and use it in GitHub Desktop.
a simple ebook cover creator
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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