LoginSignup
3
0

More than 3 years have passed since last update.

goでたくさんの画像のサイズを小さくしたい!!!!

Last updated at Posted at 2019-12-24

はじめに

こんにちはRIN1208です。
本日はクリスマスイブですね!!自分は特に予定がなく部屋で過ごしてチキンを食べました!悲しい....
この記事は画像のサイズ圧縮をかなりの量をしなくてはいけなくなったのでその制作の途中経過です(深刻なアドベントカレンダーのネタ不足....)

またこの記事はITRCアドベントカレンダーの24日目の記事になります。

開発環境

  • mac
  • goの実行環境

今回使用したパッケージ

  • github.com/google/uuid
    uuidを使うために使用しました
    GitHub
  • github.com/nfnt/resize
    画像のサイズを変更するのに使用しました
    GitHub

インストール

$ go get github.com/google/uuid
$ go get github.com/nfnt/resize

今回のコード(下で順々に解説します)

package main

import (
    "image"
    "image/jpeg"
    "image/png"
    "io/ioutil"
    "log"
    "os"

    "github.com/google/uuid"
    "github.com/nfnt/resize"
)

func main() {

    files, _ := ioutil.ReadDir("./image")
    for _, f := range files {
        save_image("./image/" + f.Name())
    }

}

func save_image(filename string) {

    path := "./datas/"  //保存先のディレクトリ名になります。現時点のコードでは既に作成していないとエラーが出ます


    uuid := create_uuid() //こちらの部分は後ほど解説します

    file, err := os.Open(filename)
    if err != nil {
        log.Fatal(err)
    }
    img, data, err := image.Decode(file)
    if err != nil {
        log.Fatal(err)
    }
    file.Close()
    m := resize.Resize(1000, 0, img, resize.Lanczos3)

    if data == "png" {
        out, err := os.Create(path + uuid + ".png")
        if err != nil {
            log.Fatal(err)
        }
        defer out.Close()
        png.Encode(out, m)
    } else if data == "jpeg" {
        out, err := os.Create(path + uuid + ".jpeg")
        if err != nil {
            log.Fatal(err)
        }
        defer out.Close()
        jpeg.Encode(out, m, nil)
    }

}

func create_uuid() string {
    u, _ := uuid.NewRandom()
    uuid := u.String()
    return uuid
}

特に難しいことはしてないでです

コードの解説

main()の部分


    files, _ := ioutil.ReadDir("./image")
    for _, f := range files {
        save_image("./image/" + f.Name())
    }

ここではimageディレクト下の画像のファイル名を取得しsave_image()関数に画像ファイルのパスを渡しています。

save_image()の部分は下で説明します。

save_image()の部分

画像のリサイズは以下の部分でしています。数値を変更するとサイズも変更されます。

m := resize.Resize(1000, 0, img, resize.Lanczos3)

こちらの部分は取得した画像がpngならpng、jpegならjpegで保存するようにしています

    if data == "png" {
        out, err := os.Create(path + uuid + ".png")
        if err != nil {
            log.Fatal(err)
        }
        defer out.Close()
        png.Encode(out, m)
    } else if data == "jpeg" {
        out, err := os.Create(path + uuid + ".jpeg")
        if err != nil {
            log.Fatal(err)
        }
        defer out.Close()
        jpeg.Encode(out, m, nil)
    }

create_uuid()の部分

ここに関しては特に説明するとがないですが今回使用した理由としては大量の画像のためファイル名がかぶらないようにしたかったので使用しました。(名前は適当でよかったので)

終わりに

ここまで読んでいただきありがとうございます。今回ここに書いてあるのは制作途中にの物でありこれから並列処理を使用して大量の画像を処理していく予定です。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0