Golang + Tinypng實現圖片壓縮

前言

所有大前端(Web、Android、iOS)的同學應該都會遇到這樣一個需求——壓縮圖片資源體積。Web端是為了加快頁面加載速度,App端是為了減小apk、ipa的體積,但不管怎么說目的是一樣的——壓縮。

查找過相關資料的同學估計都知道一個神奇的網站——Tinypng,我們可以很簡單方便的在線壓縮圖片資源,而且Tinypng的壓縮比例還是很可觀的。

Tinypng很好的解決了我們壓縮圖片的需求,而且提供了Online、API、PS-Plugin等方式供我們使用,API方面官方提供了許多語言的SDK支持,但遺憾的是并沒有golang的,所以今天帶大家使用golang來實現一下Tinypng的壓縮。

Code

  • 核心代碼
package main

import (
    "net/http"
    "io/ioutil"
    "bytes"
    "github.com/astaxie/beego/logs"
)

const (
    CompressingUrl = "https://api.tinify.com/shrink"

    // Email和ApiKey替換成自己的
    Email  = "example@163.com"
    ApiKey = "rcPxm3Zrg_1DbjYtV6AXM_-53Jg9wuWB"
)

func init() {
    logs.SetLogFuncCall(true)
    logs.SetLogFuncCallDepth(3)
}

func main() {
    // 創(chuàng)建Request
    req, err := http.NewRequest(http.MethodPost, CompressingUrl, nil)
    if err != nil {
        logs.Error(err)
        return
    }

    // 將鑒權信息寫入Request
    req.SetBasicAuth(Email, ApiKey)

    // 將圖片以二進制的形式寫入Request
    data, err := ioutil.ReadFile("test.jpg")
    if err != nil {
        logs.Error(err)
        return
    }
    req.Body = ioutil.NopCloser(bytes.NewReader(data))

    // 發(fā)起請求
    response, err := http.DefaultClient.Do(req)
    if err != nil {
        logs.Error(err)
        return
    }

    // 解析請求
    data, err = ioutil.ReadAll(response.Body)
    if err != nil {
        logs.Error(err)
        return
    }

    logs.Info(string(data))
}
  • 輸出
{
  "input":{
    "size":322199,
    "type":"image/jpeg"
  },
  "output":{
    "size":141938,
    "type":"image/jpeg",
    "width":2880,
    "height":1800,
    "ratio":0.4405,
    "url":"https://api.tinify.com/output/fg5ibhadc16kbf4h.jpg"
  }
}
  • 解析
    • 關于Email、ApiKey
      使用Tinypng的Api服務時需要注冊他們平臺的賬號,注冊地址:https://tinypng.com/developers 。注冊需要提供郵箱和用戶名,用戶名隨意填寫,郵箱就是我們代碼中的Email。注冊后平臺會給你提供的郵箱發(fā)一封郵件,里面有個鏈接,點擊去就可以看到ApiKey。
    • 關于API相關信息
      詳情見官方HTTP文檔:https://tinypng.com/developers/reference
    • 關于日志
      demo中的log使用的是beego的log模塊,這里也感謝開源庫beego
    • 關于結果
      demo最后只是把Response的body輸出了,但是從輸出結果的json也不難看出其中包含著圖片的所有信息,我們通過 output.url即可獲取壓縮后的圖片。

寫在最后

這個demo雖然實現了功能,但確實過于簡單,之后有時間我會嘗試將Tinypng所涉及到的功能多封裝在一起,以此彌補官方不提供golang SDK的遺憾。


后續(xù)篇 《Tinify API client for Golang——tinify-go》

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容