-#!/bin/sh
+#!/bin/dash
# anondcim
# forked from http://code.sotun.de/git/anondcim/
+#
+# copyright 2012-2014 Jan Huwald, Felix Kästner (fpunktk)
+#
+# 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 <http://www.gnu.org/licenses/>.
-die() {
+err() {
echo "$*" >&2
- exit 1
}
-err() {
- echo "$*" >&2
+die() {
+ err "$*"
+ exit 1
}
rand() {
# random number between 0 and $1 - 1
# read from urandom, sh interpretes numbers with leading 0 wrong, so prepend $1 which doesn't change the result
- echo $(( $1$(tr -dc "0-9" < /dev/urandom | head -c $((${#1} + 1))) % $1 ))
+ echo $(( $1$(tr -dc "0-9" < /dev/urandom | head -c $((${#1} + 2))) % $1 ))
}
-[ $# -gt 0 ] || die "Usage: $0 [-p image_prefix] [-s destination_size (absolute or percentage)] [-d destination_directory] imagefile(s)"
-
-[ ! -x "$(which convert)" ] && die "ImageMagick (convert, identify) is not installed"
-[ ! -x "$(which jhead)" ] && [ ! -x "$(which exiftool)" ] && die "jhead or exiftool has to be installed"
+type convert >/dev/null 2>&1 || die "ImageMagick (convert, identify) is not installed"
+type jhead 1>/dev/null 2>&1 || type exiftool 1>/dev/null 2>&1 || die "jhead or exiftool has to be installed"
# set default values
file_prefix=""
-dst_size="1280"
+dst_size="1920"
dst_dir="--same--"
+jpg_quality="75"
+
+[ $# -gt 0 ] || die "Usage: $0 [-p image_file_prefix] [-s destination_size (absolute or percentage, default: $dst_size)] [-d destination_directory] [-q destination_jpg_quality (default: $jpg_quality)] imagefile(s)"
-while getopts ':p:s:d:' OPTION
+while getopts ':p:s:d:q:' OPTION
do
case $OPTION in
"p")
dst_size="$OPTARG"
;;
"d")
- # enforce a trailing "/"
- [ -d "${OPTARG%/}/" ] && dst_dir="${OPTARG%/}/" || die "destination directory \"${OPTARG%/}/\" does not exist"
+ dst_dir="${OPTARG%/}/" # enforce a trailing "/"
+ [ -d "$dst_dir" ] || die "destination directory \"$dst_dir\" does not exist"
+ ;;
+ "q")
+ jpg_quality="$OPTARG"
;;
*)
err "not recognised: OPTION=$OPTION, OPTARG=$OPTARG"
cur=1
total=$#
+addend=1
for fn in "$@"
do
+ [ -f "$fn" ] || { err "source \"$fn\" does not exist and is skipped"; continue; }
+ #
if [ "$dst_dir" = "--same--" ]
then
- # if the filename contains a "/" then use this dir
- [ "$fn" != "${fn%/*}" ] && dst="${fn%/*}/" || dst=""
+ # use the directory of the source file
+ dst="$(dirname "$fn")/"
else
dst="$dst_dir"
fi
+ #
# always use a padded number as destination filename suffix
- dst="$dst$file_prefix$(echo -n "0000000000$cur" | tail -c ${#total}).jpg"
- echo "anonymizing \"$fn\" to \"$dst\" ($cur/$total)"
- [ -f "$fn" ] || { err "source \"$fn\" does not exist and is skipped"; continue; }
- [ -e "$dst" ] && { err "destination \"$dst\" for source \"$fn\" already exists, anonymization is skipped"; continue; }
-
+ dst_jpg="$dst$file_prefix$(echo -n "0000000000$cur" | tail -c ${#total}).jpg"
+ while [ -e "$dst_jpg" ] && [ $addend -lt 1000 ]
+ do
+ dst_jpg="$dst$file_prefix$(echo -n "0000000000$(($cur + $addend))" | tail -c ${#total}).jpg"
+ addend=$((addend + 1))
+ done
+ [ -e "$dst_jpg" ] && { err "destination \"$dst_jpg\" for source \"$fn\" already exists, anonymization is skipped"; continue; }
+ #
+ echo "anonymizing \"$fn\" to \"$dst_jpg\" ($cur/$total)"
+ #
read w h << EOF
$(identify -format '%w %h' "$fn")
EOF
-
+ #
# resize and distort
if [ $w -ge 100 ] && [ $h -ge 100 ]
then
if [ $w -ge 1000 ]; then dw=$(($w / 100)); else dw=10; fi
if [ $h -ge 1000 ]; then dh=$(($h / 100)); else dh=10; fi
-
+ #
w=$(($w - 1))
h=$(($h - 1))
-
+ #
convert "$fn" \
-colorspace RGB \
-distort Perspective "$(rand $dw) $(rand $dh) 0 0, $(($w - $(rand $dw))) $(rand $dh) $w 0, $(rand $dw) $(($h - $(rand $dh))) 0 $h, $(($w - $(rand $dw))) $(($h - $(rand $dh))) $w $h" \
-attenuate 2 +noise Uniform \
-resize "$dst_size" \
-colorspace sRGB \
- "$dst"
+ -quality "$jpg_quality" \
+ "$dst_jpg"
else
err "image is too small to be distorted and will just be filtered and resized"
convert "$fn" \
-attenuate 2 +noise Uniform \
-resize "$dst_size" \
-colorspace sRGB \
- "$dst"
+ -quality "$jpg_quality" \
+ "$dst_jpg"
fi
-
+ #
# remove metadata
if [ -x "$(which jhead)" ]
then
- jhead -purejpg -q "$dst" || err "removing meta-data with jhead failed"
+ jhead -purejpg -q "$dst_jpg" || err "removing meta-data with jhead failed"
fi
if [ -x "$(which exiftool)" ]
then
- exiftool -overwrite_original -all= "$dst" || err "removing meta-data with exiftool failed"
+ exiftool -quiet -overwrite_original -all= "$dst_jpg" || err "removing meta-data with exiftool failed"
fi
-
+ #
cur=$(($cur + 1))
done