使用sips命令自動(dòng)縮減圖片尺寸

使用sips命令自動(dòng)縮減圖片尺寸

使用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í)很明確。

通常:

  1. 桌面只有一張圖片的時(shí)候并村,默認(rèn)是題圖或是印象筆記的縮略圖巍实。
  2. 如果有很多圖片的話,那么一般來(lái)說(shuō)就是文章的配圖了橘霎。

后者一定要比前者小蔫浆,在分辨率上殖属。前者一般是照片姐叁,所以分辨率通常比較大,后者一般都是網(wǎng)絡(luò)圖片或者截圖洗显,尺寸會(huì)比較小外潜。

分析

尺寸確定

找了一些照片什么的,感覺(jué)1920這個(gè)寬度不錯(cuò)挠唆,如果是4:3处窥,那么就是144016: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ù)再考慮顿涣。

參考

  1. https://apple.stackexchange.com/questions/107644/sips-only-resize-if-image-is-315x300
  2. https://blog.csdn.net/10km/article/details/51906821
  3. https://ss64.com/osx/sips.html
  4. https://www.brighthub.com/computing/mac-platform/articles/58686.aspx
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末波闹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子涛碑,更是在濱河造成了極大的恐慌精堕,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒲障,死亡現(xiàn)場(chǎng)離奇詭異歹篓,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)揉阎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)庄撮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人毙籽,你說(shuō)我怎么就攤上這事洞斯。” “怎么了坑赡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵烙如,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我毅否,道長(zhǎng)亚铁,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任搀突,我火速辦了婚禮刀闷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仰迁。我一直安慰自己甸昏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布徐许。 她就那樣靜靜地躺著施蜜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雌隅。 梳的紋絲不亂的頭發(fā)上翻默,一...
    開(kāi)封第一講書(shū)人閱讀 51,274評(píng)論 1 300
  • 那天缸沃,我揣著相機(jī)與錄音,去河邊找鬼修械。 笑死趾牧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肯污。 我是一名探鬼主播翘单,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蹦渣!你這毒婦竟也來(lái)了哄芜?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤柬唯,失蹤者是張志新(化名)和其女友劉穎认臊,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體锄奢,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡失晴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了斟薇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片师坎。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡恕酸,死狀恐怖堪滨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蕊温,我是刑警寧澤袱箱,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站义矛,受9級(jí)特大地震影響发笔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凉翻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一了讨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧制轰,春花似錦前计、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至调俘,卻和暖如春伶棒,著一層夾襖步出監(jiān)牢的瞬間旺垒,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工肤无, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留先蒋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓宛渐,卻偏偏與公主長(zhǎng)得像鞭达,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子皇忿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1畴蹭、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,979評(píng)論 3 119
  • 我表姑家的女兒,在今年8月份查出來(lái)了白血病鳍烁,她的女兒才年僅14歲叨襟,正是花兒開(kāi)放的時(shí)候。因?yàn)樗麄儍蛇吋易宥紱](méi)有白血病...
    王寶玲閱讀 158評(píng)論 0 0
  • 李叫獸 1.李叫獸做了一件跟他們完全不一樣的事情:買(mǎi)書(shū)學(xué)習(xí)幔荒。也就是說(shuō)糊闽,他是所有孩子當(dāng)中唯一一個(gè)研究如何打架的人。 ...
    RebaKaHhhhh閱讀 192評(píng)論 0 1
  • 好吧爹梁,讓我們承認(rèn)右犹,我們?nèi)祟愃苷J(rèn)識(shí)的世界只是形形色色的現(xiàn)象世界。那么姚垃,在這個(gè)或者這許多個(gè)現(xiàn)象世界背后念链,究竟有沒(méi)有一...
    無(wú)湦閱讀 611評(píng)論 0 0
  • 智豬博弈|初時(shí),滴滴和快的的補(bǔ)貼大戰(zhàn)积糯,是比誰(shuí)有錢(qián)嗎掂墓?滴滴的競(jìng)爭(zhēng)對(duì)手是快的嗎?后來(lái)神州專車(chē)怎么一下就火了看成? 滴滴快的...
    馬旺旺閱讀 336評(píng)論 0 1