#!/bin/sh # Copyright 2017 jstpcs # Copyright 2017 moviuro # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. set -e usage() { cat << EOH Usage: $0 [-s] : creates a wallpaper -s : use a "safer" and slower method to get the background color $0 -h : displays this help message Example: $0 coolimage.png 1920 1080 EOH exit ${1:-0} } die() { echo "$1" && exit "${2:-1}" } if [ "$1" = "-h" ]; then usage fi if [ "$1" = "-s" ]; then getbg() { # We get all hexa codes of all pixels in the picture, and pick the most # frequent one... which should be the background color? convert "$1" -format %c +dither -depth 5 histogram:info: | sort -nr | head -1 | grep -Eo '#[A-F0-9]{6}' } shift else getbg() { # We get the color of the top-left pixel. convert "$1" -crop 1x1+0+0 -depth 8 txt: | grep -Eo '#[A-F0-9]{6}' } fi if [ $# -ne 3 ]; then usage 1 >&2 fi [ -r "$1" ] || die "File $1 is not readable!" inpfile="$1" outfile="$(basename "$inpfile")" width="$2" height="$3" bgcolor="$(getbg "$inpfile")" # We use the `-resize ..x..\>` syntax to only shrink pictures. Enlarging is # asking for trouble (artifacting, etc.) convert "$inpfile" -gravity center -resize "${width}x${height}>" \ -background "$bgcolor" -extent "${width}x${height}" \ "${outfile%.*}-${width}x${height}.${outfile##*.}"