#!/bin/bash ########################### # # Run the stipple_gen script on a sequence # of PNG images and then render the resulting # preview images into a video. Fluctuate settings # via a sine wave. # ########################### if [[ "${1}" == "" ]]; then echo "Please provide a directory of images as the first argument" exit 1 fi INPUT=`realpath "${1}"` OUTPUT=`realpath "${2}"` CONFIG="${3}" SINGLE="${4}" if [ ! -d "${INPUT}" ]; then echo "Directory ${1} doesn't exist" exit 2 fi mkdir -p "${OUTPUT}" PI=3.14159265359 FPS=24 MULTIPLE=3 STEP=$(echo "scale=6;360/45" | bc -l) AMP=1.0 STARTANGLE=270 RATE=`echo "scale=0;${FPS}/${MULTIPLE}" | bc` WIDTH=404 HEIGHT=374 DOTSIZE_MIN=1.8 DOTSIZE_MAX=6 DOTSIZE_HALF=`echo "scale=6;($DOTSIZE_MAX - $DOTSIZE_MIN) / 2" | bc` DOTSIZE=`echo "scale=6;($DOTSIZE_MIN + $DOTSIZE_HALF)" | bc` DOTSIZE_MULTIPLE=$DOTSIZE_HALF PARTICLES_MIN=200 PARTICLES_MAX=1000 PARTICLES_HALF=`echo "($PARTICLES_MAX - $PARTICLES_MIN) / 2" | bc` PARTICLES=$((PARTICLES_MIN+PARTICLES_HALF)) PARTICLES_MULTIPLE=$PARTICLES_HALF if [[ "${CONFIG}" == "" ]]; then echo "Please provide a config file" exit 1 fi IMAGES="" fluctuation () { i=$1 ANGLE=$(echo "scale=6;$STARTANGLE+($i * $STEP)" | bc) FLUCTUATION=$(echo "scale=6;s($ANGLE*($PI/180))*$AMP" | bc -l) echo $FLUCTUATION } stipple () { png="${1}" frame="${2}" rand="${3}" filename=`basename "${png}"` name=`echo "${filename}" | cut -d'.' -f1` num=`echo "${name}" | awk -F'_' '{print $(NF)}'` tmp=`mktemp`.png fluc=`fluctuation $rand` particles=`echo "scale=0;($PARTICLES-($fluc*$PARTICLES_MULTIPLE))/1" | bc` dotsize=`echo "scale=6;$DOTSIZE+($fluc*$DOTSIZE_MULTIPLE)" | bc` #echo $fluc echo "maxParticles: $particles" echo "dotSizeFactor: $dotsize" bash white.sh "${png}" "${tmp}" source "${CONFIG}" cd ~/src/stipple_gen/ bash stipple_gen.sh \ --inputImage "${tmp}" \ --outputImage "${OUTPUT}/${name}_rendered.png" \ --outputSVG "${OUTPUT}/${name}.svg" \ --config "${CONFIG}" \ --dotSizeFactor $dotsize \ --maxParticles $particles if [[ "${invert}" == "true" ]]; then convert "${OUTPUT}/${name}_rendered.png" -channel RGB -negate "${OUTPUT}/${name}_rendered.png" fi rm "${tmp}" cd ~/src/animation/ if [ "${MODE}" != "tsp" ]; then opt=`mktemp`.svg CURRENT=$(pwd) cd / svgsort --no-adjust "${OUTPUT}/${name}.svg" "${opt}" cd $CURRENT mv "${opt}" "${OUTPUT}/${name}.svg" fi } random_int () { shuf -i 1-360 -n 1 } if [[ "${SINGLE}" != "" ]]; then echo "Rendering a single frame, #${SINGLE}" #files in dir for png in "${INPUT}/"*.png ; do if [[ ${i} -eq ${SINGLE} ]]; then r=$(random_int) #echo $r stipple "${png}" ${i} ${r} break fi i=$((i+1)) done exit fi i=0; #files in dir for png in "${INPUT}/"*.png ; do r=$(random_int) #echo $r stipple "${png}" ${i} ${r} i=$((i+1)) done if [[ "${IMAGES}" == "" ]]; then part=`echo "${name}" | awk -F'_0' '{print $1}'` IMAGES="${OUTPUT}/${part}_%06d_rendered.png" VIDEO="${OUTPUT}/${part}.mov" fi ffmpeg -y -r ${RATE} -f image2 -i "${IMAGES}" \ -r ${FPS} \ -c:v prores_ks -profile:v 3 \ "${VIDEO}"