Last active
May 31, 2021 17:26
-
-
Save kbauer/e5bd0dc12142e7a6c97f to your computer and use it in GitHub Desktop.
A tool for converting scanned or photographed pages into a fax-style bi-level png with minimal storage use. Also removes background color gradients. See also my other gist `imagemagick-scan-pdf-to-mono.sh`
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
# -*- mode: sh; coding: us-ascii-unix -*- | |
source libstacktrace || true | |
set -e -u -E | |
MANUAL=" | |
Usage: $0 INFILE OUTFILE [BLURRADIUS;default:20px] | |
Takes a document scan INFILE (an image) and produces a monochromatized | |
output file version. | |
If INFILE=OUTFILE, creates a backup file INFILE.000.bak etc. | |
If Only INFILE is given, uses BLURRADIUS=0 and OUTFILE=INFILE, which | |
is useful when editing a mono-chromed file has inflated its file size. | |
Note that OUTFILE will always be a PNG file, regardless of extension. | |
The method for removing the background brightness gradient is based on | |
the discussion | |
http://superuser.com/questions/693339/ | |
" | |
if [[ "${1:-}" = "-?" ]] || [[ "${1:-}" = "-h" ]] || \ | |
[[ "${1:-}" = "--help" ]] || [[ $# -lt 1 ]]; then | |
echo "$MANUAL" | |
exit 0 | |
fi | |
INFILE="$(readlink -m "$1")" | |
if [[ $# -gt 1 ]]; then | |
BLURRADIUS="${3:-20}" | |
OUTFILE="$(readlink -m "$2")" | |
else | |
BLURRADIUS=0 | |
OUTFILE="$INFILE" | |
fi | |
TMPDIR="$(mktemp -d)" | |
cd "$TMPDIR" | |
if [[ $INFILE = $OUTFILE ]]; then | |
bakname() { printf "$INFILE.%03d.bak" "$1"; } | |
i=0; | |
while [[ -e $(bakname $i) ]]; do i=$((i+1)); done | |
BAKNAME=$(bakname "$i") | |
cp "$INFILE" "$BAKNAME" | |
fi | |
if [[ $BLURRADIUS -ne 0 ]]; then | |
convert -density 150 "$INFILE" -background white -flatten -colorspace Gray 01.png | |
convert 01.png -blur "${BLURRADIUS}x${BLURRADIUS}" 02.tif | |
convert 01.png 02.tif -compose Divide_Src -composite 03.tif | |
convert 03.tif -threshold 80% -type bilevel -compress group4 png:"$OUTFILE" | |
else | |
convert "$INFILE" -threshold 80% -type bilevel -compress group4 png:"$OUTFILE" | |
fi | |
rm -f 01.png 02.tif 03.tif | |
rmdir "$TMPDIR" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment