とある子育てパパの日記

とある子育てパパの日記です

画像をリサイズしてDBへ保存する / golang

時間がかかったのでメモ

やりたいこと

  • 画像からサムネイルを作成する(300*300のサイズに収まるようにリサイズ)
  • 作成したサムネイルをDBへ保存する

環境など

  • Mac(キャピタン)
  • go version go1.7 darwin/amd64
  • gorm というormマッパーを使用 github.com
  • resizeという画像リサイズをしてくれるパッケージを使用 github.com
  • DBはMySQL5.5.42
  • テーブル定義は下記の通り/ images f:id:dempatow:20161117123633p:plain

コード

//main.go

package main

import (
    "bytes"
    "image/jpeg"
    "log"
    "os"
    "time"

    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
    "github.com/nfnt/resize"
)

// テーブル定義
type Images struct {
    //  gorm.Model
    Id          int
    Source      []uint8
    Description string
    Created_at  time.Time
    Updated_at  time.Time
}

// DB接続情報
const (
    dbUser     = "hogehoge"
    dbPassword = "hogehoge"
    dbName     = "hogehoge"
)

func main() {

    // 画像読み込み
    file, err := os.Open("test.jpg")
    if err != nil {
        log.Fatal(err)
    }

    img, err := jpeg.Decode(file)
    if err != nil {
        log.Fatal(err)
    }
    file.Close()

    // 300*300に収まるようにリサイズした画像を取得
    imgThumb := resize.Thumbnail(300, 300, img, resize.Lanczos3)

    // ファイル保存
    out, err := os.Create("thumbnail.jpg")
    if err != nil {
        log.Fatal(err)
    }
    defer out.Close()
    jpeg.Encode(out, imgThumb, nil)

    // データベースへの保存
    buffer := new(bytes.Buffer)
    if err := jpeg.Encode(buffer, imgThumb, nil); err != nil {
        log.Println("unable to encode image.")
    }
    imageBytes := buffer.Bytes()

    db, err := gorm.Open("mysql", dbUser+":"+dbPassword+"@/"+dbName+"?charset=utf8&parseTime=True&loc=Local")
    if err != nil {
        panic("failed to connect database")
    }

    insertRow := Images{Source: imageBytes, Description: "テスト画像"}
    db.Create(&insertRow)
    defer db.Close()
}
  • test.jpgを同じファイルに置いてから実行すると、リサイズ画像をDBへ保存し、thumbnail.jpgがローカルへ保存される。