add oxiora script for handling OpenRaster files
Ref https://openraster.org/
This commit is contained in:
parent
90ceef9796
commit
a5f96b2a5e
1 changed files with 82 additions and 0 deletions
82
scripts/oxiora.sh
Executable file
82
scripts/oxiora.sh
Executable file
|
|
@ -0,0 +1,82 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -e;
|
||||
|
||||
###
|
||||
## Input handling
|
||||
###
|
||||
|
||||
# Set flags for calling oxipng later
|
||||
if [[ -n "${UNSAFE}" ]]; then FLAGS="${FLAGS} -a"; fi
|
||||
|
||||
if [[ -z "${1}" ]]; then
|
||||
echo "Wrapper for oxipng for handling OpenRaster files
|
||||
|
||||
Usage:
|
||||
oxiora file_a.ora file_b.ora ... file_n.ora
|
||||
|
||||
Environment variables:
|
||||
UNSAFE
|
||||
Set to any value to send the -a flag to oxipng, which allows altering the colour of completely transparent pixels. Alters the content of images, so disabled by default.
|
||||
|
||||
FLAGS
|
||||
Any additional flags to pass to oxipng.
|
||||
";
|
||||
exit 0;
|
||||
fi
|
||||
|
||||
###
|
||||
## Preamble
|
||||
###
|
||||
|
||||
# Create temporary directory and clean it up afterwards no matter what
|
||||
temp_dir="$(mktemp --tmpdir -d "oxiora-XXXXXXX")";
|
||||
|
||||
on_exit() {
|
||||
rm -rf "${temp_dir}";
|
||||
}
|
||||
trap on_exit EXIT;
|
||||
|
||||
###
|
||||
## Main loop
|
||||
###
|
||||
|
||||
# We process serially here, because oxipng does a good job of using all available CPU cores already
|
||||
for filepath in "$@"; do
|
||||
echo ">>> Processing ${filepath}";
|
||||
|
||||
filesize_before="$(wc -c <"${filepath}")";
|
||||
|
||||
unzip "${filepath}" -d "${temp_dir}";
|
||||
chmod u+w -R "${temp_dir}"
|
||||
|
||||
# no -a here 'cause this is technically an editing file to fully-transparent pixel colours could have meaning
|
||||
#shellcheck disable=SC2086
|
||||
find "${temp_dir}" -iname '*.png' -print0 | xargs -0 oxipng ${FLAGS} -somax;
|
||||
|
||||
filepath_target="${filepath%.*}-small.${filepath##*.}";
|
||||
filepath_target="$(realpath "${filepath_target}")";
|
||||
|
||||
# The OpenRaster spec says the mimetype file has to be uncompressed
|
||||
# Ref https://www.openraster.org/baseline/file-layout-spec.html#mimetype
|
||||
# unzip style ref https://askubuntu.com/a/1399484/139735
|
||||
(cd "${temp_dir}" && find . -type f -name 'mimetype' | zip -0 -r "${filepath_target}" --names-stdin)
|
||||
(cd "${temp_dir}" && find . -type f -not -name 'mimetype' | zip -9 -r "${filepath_target}" --names-stdin)
|
||||
|
||||
# Only write the .ora back if it is smaller than the original
|
||||
filesize_after="$(wc -c <"${filepath_target}")";
|
||||
difference="$((filesize_before-filesize_after))";
|
||||
|
||||
echo ">>> BEFORE $(echo "${filesize_before}" | numfmt --to=iec)iB";
|
||||
echo ">>> AFTER $(echo "${filesize_after}" | numfmt --to=iec)iB";
|
||||
|
||||
if [[ "${filesize_after}" -lt "${filesize_before}" ]]; then
|
||||
echo ">>> Compressed by $(echo "${difference}" | numfmt --to=iec)iB";
|
||||
mv -f "${filepath_target}" "${filepath}";
|
||||
else
|
||||
echo ">>> Compressed file was $(echo "$((-difference))" | numfmt --to=iec)iB larger, discarding";
|
||||
rm "${filepath_target}";
|
||||
fi
|
||||
|
||||
find "${temp_dir}" -mindepth 1 -delete
|
||||
done
|
||||
Loading…
Reference in a new issue