Skip to content

Instantly share code, notes, and snippets.

@smotesko
Last active September 20, 2017 19:16
Show Gist options
  • Save smotesko/f1a45397639b1f675a85eeab7eabdec3 to your computer and use it in GitHub Desktop.
Save smotesko/f1a45397639b1f675a85eeab7eabdec3 to your computer and use it in GitHub Desktop.
Composes two images into a single image of the same size, with a slightly diagonal line between them
#! /usr/bin/env bash
set -e
STROKECOLOR="white"
STROKEWIDTHDIV=38
STROKEPOINTOFFSETDIV=25
if [ "$#" -ne 3 ]; then
echo "Usage:"
echo "$0 left_image right_image composed_image"
echo
echo "This script stitches two images of the same size into one image "
echo "(of the same size) with a slightly diagonal line between the "
echo "left and right halves. Should be useful for 'before and after' "
echo "illustrations."
echo "I really hope your filenames have .extensions"
echo "Written by Volodymyr Smotesko"
exit 1
fi
WIDTH1=$(identify -format "%[fx:w]" "$1")
HEIGHT1=$(identify -format "%[fx:h]" "$1")
WIDTH2=$(identify -format "%[fx:w]" "$2")
HEIGHT2=$(identify -format "%[fx:h]" "$2")
if [ $WIDTH1 -ne $WIDTH2 ]; then
echo "input images must have same dimensions"
exit 1
fi
if [ $HEIGHT1 -ne $HEIGHT2 ]; then
echo "input images must have same dimensions"
exit 1
fi
WIDTH=$WIDTH1
HEIGHT=$HEIGHT1
QWIDTH=$(echo "$WIDTH/4" | bc)
STROKEPOINTOFFSET=$(echo "$WIDTH/$STROKEPOINTOFFSETDIV" | bc)
STROKEWIDTH=$(echo "$WIDTH/$STROKEWIDTHDIV" | bc)
STROKEPOINT1X=$(echo "$WIDTH/2+$STROKEPOINTOFFSET" | bc)
STROKEPOINT1Y=$(echo "0" | bc)
STROKEPOINT2X=$(echo "$WIDTH/2-$STROKEPOINTOFFSET" | bc)
STROKEPOINT2Y=$(echo "$HEIGHT" | bc)
STITCHEDFILE="$3"
STITCHEDFILEDIR=$(dirname "$STITCHEDFILE")
STITCHEDFILENAME=$(basename "$STITCHEDFILE")
STITCHEDFILENOEXT="${STITCHEDFILENAME%.*}"
STITCHEDFILEEXT="${STITCHEDFILENAME##*.}"
STITCHEDFILE="$STITCHEDFILEDIR/$STITCHEDFILENOEXT-stitched.$STITCHEDFILEEXT"
LEFTFILENAME=$(basename "$1")
LEFTFILENOEXT="${LEFTFILENAME%.*}"
LEFTFILEEXT="${LEFTFILENAME##*.}"
LEFTFILE="$STITCHEDFILEDIR/$LEFTFILENOEXT-lefthalf.$LEFTFILEEXT"
RIGHTFILENAME=$(basename "$2")
RIGHTFILENOEXT="${RIGHTFILENAME%.*}"
RIGHTFILEEXT="${RIGHTFILENAME##*.}"
RIGHTFILE="$STITCHEDFILEDIR/$RIGHTFILENOEXT-righthalf.$RIGHTFILEEXT"
MASKFILE="$STITCHEDFILEDIR/$STITCHEDFILENOEXT-strokemask.gif"
STROKE="M $STROKEPOINT1X,$STROKEPOINT1Y L $STROKEPOINT2X,$STROKEPOINT2Y"
convert \
-size ${WIDTH}x${HEIGHT} xc:black -fill white \
-draw "path '$STROKE $WIDTH,$HEIGHT $WIDTH,0 Z'" \
"$MASKFILE"
convert "$1" -repage -$QWIDTH+0 -background $STROKECOLOR -flatten "$LEFTFILE"
convert "$2" -repage +$QWIDTH+0 -background $STROKECOLOR -flatten "$RIGHTFILE"
convert "$LEFTFILE" "$RIGHTFILE" "$MASKFILE" -composite "$STITCHEDFILE"
convert -stroke $STROKECOLOR -fill $STROKECOLOR -strokewidth $STROKEWIDTH \
-draw "stroke-linecap round path '$STROKE'" \
"$STITCHEDFILE" "$3"
rm "$LEFTFILE" "$RIGHTFILE" "$MASKFILE" "$STITCHEDFILE"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment