008ef4eccd49eebeda00d0d899d0886ba0894179
[dotfiles.git] / shell / .local / bin / resize.sh
1 #!/bin/bash
2 set -e
3
4 if [[ "$#" -ne 2 ]] || ! [[ -e "$1" ]] ||\
5 ! [[ "$2" =~ ^[0-9]+[eEpPtTgGmMkKbB]?$ ]]; then
6 echo "Usage: $0 FILE TGT" >&2
7 echo " TGT is in bytes. Allowed suffixes: bB,kK,mM,gG,tT,pP,eE" >&2
8 echo " The result will be outputted to stdout. The progress to stderr" >&2
9 exit
10 fi
11
12 TGT=${2::-1}
13 case "$2" in
14 *[eE]) TGT=$((TGT*1024));&
15 *[pP]) TGT=$((TGT*1024));&
16 *[tT]) TGT=$((TGT*1024));&
17 *[gG]) TGT=$((TGT*1024));&
18 *[mM]) TGT=$((TGT*1024));&
19 *[kK]) TGT=$((TGT*1024));&
20 *[bB]) ;;
21 *) TGT=$2
22 esac
23
24 ORIGTGT=$(stat --printf="%s" "$1")
25 printf "Original: % 20d\n" $ORIGTGT >&2
26 printf "Target : % 20d\n" $TGT >&2
27 if [[ "$TGT" -ge "$ORIGTGT" ]]; then
28 echo "TGT is already bigger than the original size" >&2
29 exit
30 fi
31
32 ORIG=$(identify "$1" | grep -oP '[0-9]+(?=x[0-9]+\+[0-9]+\+[0-9]+)')
33 STEP=$((ORIG/2))
34 PREV=0
35 CUR=$ORIG
36 D=-1
37 echo -n "Resize to: " >&2
38 while true; do
39 PREV=$CUR;
40 CUR=$((CUR+D*STEP))
41 STEP=$((STEP/2))
42 if [[ $PREV -eq $CUR ]]; then break; fi
43 if [[ $(convert "$1" -resize ${CUR}x jpg:- | wc -c) -ge $TGT ]];
44 then D=-1; else D=1; fi
45 echo -n "$CUR," >&2
46 done
47 echo -e "\b " >&2
48 convert "$1" -resize "${CUR}x" jpg:-