使用sips命令自動縮減圖片尺寸

使用sips命令自動縮減圖片尺寸

使用sips命令自動縮減圖片尺寸

記得之前有一本書上說,有一個工程師寫腳本很厲害,小到發郵件,大到煮咖啡,全部都是腳本完成。作為ITer,我們得習慣將自己的日常需求自動化,智能化。腳本,只是一個開始……

背景

長期使用印象筆記來記錄日志,之前沒有搞清楚印象筆記的縮略圖是怎么選的,前不久剛搞清楚。

此外,還在維護兩個公眾號,里面多多少少也有圖片需要處理。

不論是寫日志還是維護公眾號,每次圖片一多,圖片的處理就非常耗時。

需求

既然是耗時,就需要節省時間啦,需求其實很明確。

通常:

  1. 桌面只有一張圖片的時候,默認是題圖或是印象筆記的縮略圖。
  2. 如果有很多圖片的話,那么一般來說就是文章的配圖了。

后者一定要比前者小,在分辨率上。前者一般是照片,所以分辨率通常比較大,后者一般都是網絡圖片或者截圖,尺寸會比較小。

分析

尺寸確定

找了一些照片什么的,感覺1920這個寬度不錯,如果是4:3,那么就是1440,16:9對應的就是1080。

而配圖要小一號,自然使用1600:1200比較合適了。

工具確定

接下來就需要找OSX下處理圖片的命令了。話說Python可以做,但是好久沒摸Python了,但是shell一直在用,而且在帶別人學習。所以使用shell自然最容易。

還好,OSX下有一個sips的命令,對圖片處理比較方便,相關信息都可以獲取到。這個命令自從10.4版本就有了。

命令的參數及使用可以參見這里:https://ss64.com/osx/sips.html

解決方案

因為課程里都要支持參數,所以默認支持了以下三個:

  • -d:調試模式
  • -v:復雜信息模式;
  • -h:幫助;

具體腳本如下,在公司反而訪問不了我的代理了,無語?;丶以賯鞯?code>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 $@

其他

恩,初步完成,但是不同公眾號的圖片尺寸問題等還需要再斟酌一下,后續再考慮。

參考

  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
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網絡請求組件 FMDB本地數據庫組件 SD...
    陽明AGI閱讀 16,009評論 3 119
  • 我表姑家的女兒,在今年8月份查出來了白血病,她的女兒才年僅14歲,正是花兒開放的時候。因為他們兩邊家族都沒有白血病...
    王寶玲閱讀 161評論 0 0
  • 李叫獸 1.李叫獸做了一件跟他們完全不一樣的事情:買書學習。也就是說,他是所有孩子當中唯一一個研究如何打架的人。 ...
    RebaKaHhhhh閱讀 207評論 0 1
  • 好吧,讓我們承認,我們人類所能認識的世界只是形形色色的現象世界。那么,在這個或者這許多個現象世界背后,究竟有沒有一...
    無湦閱讀 621評論 0 0
  • 智豬博弈|初時,滴滴和快的的補貼大戰,是比誰有錢嗎?滴滴的競爭對手是快的嗎?后來神州專車怎么一下就火了? 滴滴快的...
    馬旺旺閱讀 344評論 0 1