#!/bin/sh # gifcap: Make an iFunny GIF caption # Copyright (C) 2024 Sasha Koshka (pseudonymous) # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . name="$0" font="ifunny.otf" input="" output="" caption="" usage () { echo "Usage: $name [OPTION]... CAPTION..." echo "Make an iFunny GIF caption." echo "" echo " -f, --font specify a font to use (default: $font)" echo " -i, --input the input file (required)" echo " -o, --output the output file (default: input)" echo " --help display this help and exit" } while test $# -gt 0; do case $1 in -f|--font) font="$2" shift; shift ;; -i|--input) input="$2" shift; shift ;; -o|--output) output="$2" shift; shift ;; --help) usage exit 0 ;; -*|--*) usage exit 2 ;; *) if test -z "$caption"; then caption="$1" else caption="$caption $1" fi shift ;; esac done if test -z "$input"; then usage exit 2 fi if test -z "$output"; then output="captioned-`basename "$input"`" fi if ! test -f "$input"; then echo "$name: $input not found" exit 1 fi captionWidth="512x" captionTemp=`mktemp --suffix=".png"` imageWidth=`identify -ping -format "%[w]x\n" "$input" | head -n 1` echo "$name: generating caption..." convert \ -background white -fill "#010000" -font "$font" \ -pointsize 55 -size "$captionWidth" -gravity Center \ caption:"$caption" \ -bordercolor white -border 20x20 \ "$captionTemp" || exit 1 echo "$name: compositing over $input..." # https://www.imagemagick.org/discourse-server/viewtopic.php?t=33797 convert \ "$captionTemp" -resize "$imageWidth" \ -background white \( "$input" -coalesce \) \ -set page "%[fx:u.w]x%[fx:u.h+v.h]+%[fx:t?(u.w-v.w)/2:0]+%[fx:t?u.h:0]" -coalesce \ null: -insert 1 -layers composite -layers optimize \ "$output" || exit 1 rm "$captionTemp" echo "$name: done!"