画像をリサイズしてDBへ保存する / golang
時間がかかったのでメモ
やりたいこと
- 画像からサムネイルを作成する(300*300のサイズに収まるようにリサイズ)
- 作成したサムネイルをDBへ保存する
環境など
- Mac(キャピタン)
- go version go1.7 darwin/amd64
gorm
というormマッパーを使用 github.comresize
という画像リサイズをしてくれるパッケージを使用 github.com- DBはMySQL5.5.42
- テーブル定義は下記の通り/
images
コード
//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
がローカルへ保存される。