使用sips命令自動(dòng)縮減圖片尺寸
記得之前有一本書(shū)上說(shuō)驾凶,有一個(gè)工程師寫(xiě)腳本很厲害,小到發(fā)郵件滩褥,大到煮咖啡病蛉,全部都是腳本完成。作為ITer瑰煎,我們得習(xí)慣將自己的日常需求自動(dòng)化铺然,智能化。腳本酒甸,只是一個(gè)開(kāi)始……
背景
長(zhǎng)期使用印象筆記來(lái)記錄日志魄健,之前沒(méi)有搞清楚印象筆記的縮略圖是怎么選的,前不久剛搞清楚插勤。
此外沽瘦,還在維護(hù)兩個(gè)公眾號(hào)革骨,里面多多少少也有圖片需要處理。
不論是寫(xiě)日志還是維護(hù)公眾號(hào)析恋,每次圖片一多良哲,圖片的處理就非常耗時(shí)。
需求
既然是耗時(shí)助隧,就需要節(jié)省時(shí)間啦筑凫,需求其實(shí)很明確。
通常:
- 桌面只有一張圖片的時(shí)候并村,默認(rèn)是題圖或是印象筆記的縮略圖巍实。
- 如果有很多圖片的話,那么一般來(lái)說(shuō)就是文章的配圖了橘霎。
后者一定要比前者小蔫浆,在分辨率上殖属。前者一般是照片姐叁,所以分辨率通常比較大,后者一般都是網(wǎng)絡(luò)圖片或者截圖洗显,尺寸會(huì)比較小外潜。
分析
尺寸確定
找了一些照片什么的,感覺(jué)1920
這個(gè)寬度不錯(cuò)挠唆,如果是4:3
处窥,那么就是1440
,16:9
對(duì)應(yīng)的就是1080玄组。
而配圖要小一號(hào)滔驾,自然使用1600:1200
比較合適了。
工具確定
接下來(lái)就需要找OSX下處理圖片的命令了俄讹。話說(shuō)Python
可以做哆致,但是好久沒(méi)摸Python
了,但是shell
一直在用患膛,而且在帶別人學(xué)習(xí)摊阀。所以使用shell
自然最容易。
還好踪蹬,OSX下有一個(gè)sips
的命令胞此,對(duì)圖片處理比較方便,相關(guān)信息都可以獲取到跃捣。這個(gè)命令自從10.4
版本就有了漱牵。
命令的參數(shù)及使用可以參見(jiàn)這里:https://ss64.com/osx/sips.html
解決方案
因?yàn)檎n程里都要支持參數(shù),所以默認(rèn)支持了以下三個(gè):
- -d:調(diào)試模式
- -v:復(fù)雜信息模式疚漆;
- -h:幫助酣胀;
具體腳本如下蚊惯,在公司反而訪問(wèn)不了我的代理了,無(wú)語(yǔ)灵临〗匦停回家再傳到Github
上。
#!/bin/bash
# -------------------- Copyright --------------------
# FileName: asimg.sh
# Description: Automatic scaling images
# Version: 1.0
# Date: 2018/08/14
# Author: Rex Kang
# Email: rex.kang.qq.com
# -------------------- History --------------------
# 2018/08/14: First version
# -------------------- End --------------------
help() {
echo "usage:"
echo -e "\tbash $0 [-cdvh] imgs"
echo "parameters:"
echo -e "\t-d:\tEnabled debug mode."
echo -e "\t-v:\tEnabled verbose mode."
echo -e "\t-h:\tShow help."
}
process() {
OLD_IFS="$IFS"
path='~/Desktop'
cd $path
# get all the images that need process.
imgs=$(ls -A1 $path | tail -n +2 | grep -E "${ext}")
imgs_num=`echo "$imgs" | wc -l | grep -Eo '[0-9]+'`
if [ $imgs_num -eq 0 ]; then
echo 'No images need to be processed.'
exit 1
elif [ $imgs_num -eq 1 ]; then
default=("${cover[@]}")
$debug && echo -e "debug:\tcover mode."
elif [ $imgs_num -gt 1 ]; then
default=("${general[@]}")
$debug && echo -e "debug:\tgeneral mode."
fi
echo "${default[@]}"
( $verbose || $debug ) && echo -e "info:\timages: ${imgs_num}"
IFS=$'\n'
echo "$imgs" | while read line
do
# calculating pixels and scaling
img_name="$line"
echo -e "info:\t${img_name}"
output=$(sips -g pixelHeight -g pixelWidth "$img_name")
$debug && echo -e "output:\t"$output
width=`echo "$output" | grep pixelWidth | grep -Eo '[0-9]+'`
height=`echo "$output" | grep pixelHeight | grep -Eo '[0-9]+'`
max=$width; [ $height -gt $width ] && max=$height
$debug && echo -e "debug:\twidth: $width, height: $height, max: $max"
resolution=$(( height * width ))
$debug && echo -e "debug:\tresolution: $resolution, default: ${default[2]}"
if [ $resolution -gt ${default[2]} ]; then
$debug && echo -e "debug:\timage need to reduce."
max_after=`echo "scale=4;$max/sqrt($resolution/${default[2]})" | bc`
$debug && echo -e "debug:\timage max after resize is ${max_after}."
sips -Z $max_after "$img_name" > /dev/null 2>&1
[ $? -eq 0 ] && echo -e "info:\tresize successfully." || echo -e "info:\tresize failed."
else
echo -e "info:\tno need to resize."
fi
done
IFS="$OLD_IFS"
}
main() {
debug=false
verbose=false
default=(1600 1200 1920000)
general=(1600 1200 1920000)
cover=(1920 1440 2764800)
ext="\.jpeg|\.jpg|\.png|\.gif|\.bmp"
while getopts "hvd" OPT; do
case $OPT in
v)
verbose=true
;;
d)
debug=true
;;
h)
help
exit 0
;;
?)
help
exit 1
;;
esac
done
if $debug; then
echo "----- variables -----"
echo -e "debug:\t$debug"
echo -e "verbose:$verbose"
fi
process
}
main $@
其他
恩儒溉,初步完成宦焦,但是不同公眾號(hào)的圖片尺寸問(wèn)題等還需要再斟酌一下,后續(xù)再考慮顿涣。